/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
data.c
Abstract:
This module contains global data for the x86 bios emulator.
Author:
David N. Cutler (davec) 10-Sep-1994
Environment:
Kernel mode only.
Revision History:
--*/
#include "nthal.h"
#include "emulate.h"
//
// Define emulator initialized variable.
//
BOOLEAN XmEmulatorInitialized = FALSE;
//
// Define emulator context structure.
//
XM_CONTEXT XmContext;
//
// Define operand decode table.
//
// This table contains the execution routine for each of the operand types.
//
// N.B. There is a cross indexing between the operand decode field of the
// opcode control array and the decode table.
//
POPERAND_DECODE XmOperandDecodeTable[] = {
XmPushPopSegment,
XmPushPopSegment,
XmPushPopSegment,
XmPushPopSegment,
XmPushPopSegment,
XmPushPopSegment,
XmLoadSegment,
XmLoadSegment,
XmLoadSegment,
XmLoadSegment,
XmLoadSegment,
XmLoadSegment,
XmGroup1General,
XmGroup1Immediate,
XmGroup2By1,
XmGroup2ByCL,
XmGroup2ByByte,
XmGroup3General,
XmGroup45General,
XmGroup45General,
XmGroup8BitOffset,
XmOpcodeRegister,
XmLongJump,
XmShortJump,
XmSetccByte,
XmAccumImmediate,
XmAccumRegister,
XmMoveGeneral,
XmMoveImmediate,
XmMoveRegImmediate,
XmSegmentOffset,
XmMoveSegment,
XmMoveXxGeneral,
XmFlagsRegister,
XmPushImmediate,
XmPopGeneral,
XmImulImmediate,
XmStringOperands,
XmEffectiveOffset,
XmImmediateJump,
XmImmediateEnter,
XmGeneralBitOffset,
XmShiftDouble,
XmPortImmediate,
XmPortDX,
XmBitScanGeneral,
XmByteImmediate,
XmXlatOpcode,
XmGeneralRegister,
XmNoOperands,
XmOpcodeEscape,
XmPrefixOpcode
};
//
// Define opcode function table.
//
// This table contains the execution routine for each opcode.
//
// N.B. There is cross indexing between the function index field of the
// opcode control array and the function table. The function index
// in the opcode control array may be the index of the execution
// function, the base index of the execution function, or a switch
// value to be used in selecting the function (i.e., prefix opcodes).
//
POPCODE_FUNCTION XmOpcodeFunctionTable[] = {
//
// ASCII operators.
//
XmAaaOp,
XmAadOp,
XmAamOp,
XmAasOp,
XmDaaOp,
XmDasOp,
//
// Group 1 operators.
//
XmAddOp,
XmOrOp,
XmAdcOp,
XmSbbOp,
XmAndOp,
XmSubOp,
XmXorOp,
XmCmpOp,
//
// Group 2 operators.
//
XmRolOp,
XmRorOp,
XmRclOp,
XmRcrOp,
XmShlOp,
XmShrOp,
XmIllOp,
XmSarOp,
//
// Group 3 operators.
//
XmTestOp,
XmIllOp,
XmNotOp,
XmNegOp,
XmMulOp,
XmImulxOp,
XmDivOp,
XmIdivOp,
//
// Group 4 and 5 operators.
//
XmIncOp,
XmDecOp,
XmCallOp,
XmCallOp,
XmJmpOp,
XmJmpOp,
XmPushOp,
XmIllOp,
//
// Group 8 operators.
//
XmBtOp,
XmBtsOp,
XmBtrOp,
XmBtcOp,
//
// Stack push and pop operators.
//
XmPopOp,
XmPushaOp,
XmPopaOp,
//
// Conditional jump operators.
//
XmJxxOp,
XmLoopOp,
XmJcxzOp,
//
// Control operators.
//
XmEnterOp,
XmHltOp,
XmIntOp,
XmIretOp,
XmLeaveOp,
XmRetOp,
//
// Set boolean byte value based on condition.
//
XmSxxOp,
//
// Condition code operators.
//
XmCmcOp,
XmClcOp,
XmStcOp,
XmCliOp,
XmStiOp,
XmCldOp,
XmStdOp,
XmLahfOp,
XmSahfOp,
//
// General move operators.
//
XmMovOp,
XmXchgOp,
//
// Convert operators.
//
XmCbwOp,
XmCwdOp,
//
// Single multiply operator.
//
XmImulOp,
//
// String operators.
//
XmCmpsOp,
XmInsOp,
XmLodsOp,
XmMovsOp,
XmOutsOp,
XmScasOp,
XmStosOp,
//
// Effective address operators.
//
XmBoundOp,
XmMovOp,
//
// Double Shift operators.
//
XmShldOp,
XmShrdOp,
//
// I/O operators.
//
XmInOp,
XmOutOp,
//
// Bit scan operators.
//
XmBsfOp,
XmBsrOp,
//
// Byte swap operators.
//
XmBswapOp,
//
// Add/Compare exchange operators.
//
XmXaddOp,
XmCmpxchgOp,
//
// No operation.
//
XmNopOp,
//
// Illegal opcode.
//
XmIllOp
};
//
// Define opcode control table.
//
// There are two opcode tables which control the emulation of each x86
// opcode. One table is for single byte opcodes and the other is for
// two byte opcodes.
//
OPCODE_CONTROL XmOpcodeControlTable1[] = {
{X86_ADD_OP, FormatGroup1General}, // 0x00 - add Eb,Gb
{X86_ADD_OP, FormatGroup1General}, // 0x01 - add Ev,Gv
{X86_ADD_OP, FormatGroup1General}, // 0x02 - add Gb,Eb
{X86_ADD_OP, FormatGroup1General}, // 0x03 - add Gv,Ev
{X86_ADD_OP, FormatAccumImmediate}, // 0x04 - add AL,Ib
{X86_ADD_OP, FormatAccumImmediate}, // 0x05 - add eAX,Iv
{X86_PUSH_OP, FormatSegmentES}, // 0x06 - push ES
{X86_POP_OP, FormatSegmentES}, // 0x07 - pop ES
{X86_OR_OP, FormatGroup1General}, // 0x08 - or Eb,Gb
{X86_OR_OP, FormatGroup1General}, // 0x09 - or Ev,Gv
{X86_OR_OP, FormatGroup1General}, // 0x0a - or Gb,Eb
{X86_OR_OP, FormatGroup1General}, // 0x0b - or Gv,Ev
{X86_OR_OP, FormatAccumImmediate}, // 0x0c - or AL,Ib
{X86_OR_OP, FormatAccumImmediate}, // 0x0d - or eAX,Iv
{X86_PUSH_OP, FormatSegmentCS}, // 0x0e - push CS
{0, FormatOpcodeEscape}, // 0x0f - escape:
{X86_ADC_OP, FormatGroup1General}, // 0x10 - adc Eb,Gb
{X86_ADC_OP, FormatGroup1General}, // 0x11 - adc Ev,Gv
{X86_ADC_OP, FormatGroup1General}, // 0x12 - adc Gb,Eb
{X86_ADC_OP, FormatGroup1General}, // 0x13 - adc Gv,Ev
{X86_ADC_OP, FormatAccumImmediate}, // 0x14 - adc AL,Ib
{X86_ADC_OP, FormatAccumImmediate}, // 0x15 - adc eAX,Iv
{X86_PUSH_OP, FormatSegmentSS}, // 0x16 - push SS
{X86_POP_OP, FormatSegmentSS}, // 0x17 - pop SS
{X86_SBB_OP, FormatGroup1General}, // 0x18 - sbb Eb,Gb
{X86_SBB_OP, FormatGroup1General}, // 0x19 - sbb Ev,Gv
{X86_SBB_OP, FormatGroup1General}, // 0x1a - sbb Gb,Eb
{X86_SBB_OP, FormatGroup1General}, // 0x1b - sbb Gv,Ev
{X86_SBB_OP, FormatAccumImmediate}, // 0x1c - sbb AL,Ib
{X86_SBB_OP, FormatAccumImmediate}, // 0x1d - sbb eAX,Iv
{X86_PUSH_OP, FormatSegmentDS}, // 0x1e - push DS
{X86_POP_OP, FormatSegmentDS}, // 0x1f - pop DS
{X86_AND_OP, FormatGroup1General}, // 0x20 - and Eb,Gb
{X86_AND_OP, FormatGroup1General}, // 0x21 - and Ev,Gv
{X86_AND_OP, FormatGroup1General}, // 0x22 - and Gb,Eb
{X86_AND_OP, FormatGroup1General}, // 0x23 - and Gv,Ev
{X86_AND_OP, FormatAccumImmediate}, // 0x24 - and AL,Ib
{X86_AND_OP, FormatAccumImmediate}, // 0x25 - and eAX,Iv
{X86_ES_OP, FormatPrefixOpcode}, // 0x26 - ES:
{X86_DAA_OP, FormatNoOperands}, // 0x27 - daa
{X86_SUB_OP, FormatGroup1General}, // 0x28 - sub Eb,Gb
{X86_SUB_OP, FormatGroup1General}, // 0x29 - sub Ev,Gv
{X86_SUB_OP, FormatGroup1General}, // 0x2a - sub Gb,Eb
{X86_SUB_OP, FormatGroup1General}, // 0x2b - sub Gv,Ev
{X86_SUB_OP, FormatAccumImmediate}, // 0x2c - sub AL,Ib
{X86_SUB_OP, FormatAccumImmediate}, // 0x2d - sub eAX,Iv
{X86_CS_OP, FormatPrefixOpcode}, // 0x2e - CS:
{X86_DAS_OP, FormatNoOperands}, // 0x2f - das
{X86_XOR_OP, FormatGroup1General}, // 0x30 - xor Eb,Gb
{X86_XOR_OP, FormatGroup1General}, // 0x31 - xor Ev,Gv
{X86_XOR_OP, FormatGroup1General}, // 0x32 - xor Gb,Eb
{X86_XOR_OP, FormatGroup1General}, // 0x33 - xor Gv,Ev
{X86_XOR_OP, FormatAccumImmediate}, // 0x34 - xor AL,Ib
{X86_XOR_OP, FormatAccumImmediate}, // 0x35 - xor eAX,Iv
{X86_SS_OP, FormatPrefixOpcode}, // 0x36 - SS:
{X86_AAA_OP, FormatNoOperands}, // 0x37 - aaa
{X86_CMP_OP, FormatGroup1General}, // 0x38 - cmp Eb,Gb
{X86_CMP_OP, FormatGroup1General}, // 0x39 - cmp Ev,Gv
{X86_CMP_OP, FormatGroup1General}, // 0x3a - cmp Gb,Eb
{X86_CMP_OP, FormatGroup1General}, // 0x3b - cmp Gv,Ev
{X86_CMP_OP, FormatAccumImmediate}, // 0x3c - cmp AL,Ib
{X86_CMP_OP, FormatAccumImmediate}, // 0x3d - cmp eAX,Iv
{X86_DS_OP, FormatPrefixOpcode}, // 0x3e - DS:
{X86_AAS_OP, FormatNoOperands}, // 0x3f - aas
{X86_INC_OP, FormatOpcodeRegister}, // 0x40 - inc eAX
{X86_INC_OP, FormatOpcodeRegister}, // 0x41 - inc eCX
{X86_INC_OP, FormatOpcodeRegister}, // 0x42 - inc eDX
{X86_INC_OP, FormatOpcodeRegister}, // 0x43 - inc eBX
{X86_INC_OP, FormatOpcodeRegister}, // 0x44 - inc eSP
{X86_INC_OP, FormatOpcodeRegister}, // 0x45 - inc eBP
{X86_INC_OP, FormatOpcodeRegister}, // 0x46 - inc eSI
{X86_INC_OP, FormatOpcodeRegister}, // 0x47 - inc eDI
{X86_DEC_OP, FormatOpcodeRegister}, // 0x48 - dec eAX
{X86_DEC_OP, FormatOpcodeRegister}, // 0x49 - dec eCX
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4a - dec eDX
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4b - dec eBX
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4c - dec eSP
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4d - dec eBP
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4e - dec eSI
{X86_DEC_OP, FormatOpcodeRegister}, // 0x4f - dec eDI
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x50 - push eAX
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x51 - push eCX
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x52 - push eDX
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x53 - push eBX
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x54 - push eSP
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x55 - push eBP
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x56 - push eSI
{X86_PUSH_OP, FormatOpcodeRegister}, // 0x57 - push eDI
{X86_POP_OP, FormatOpcodeRegister}, // 0x58 - pop eAX
{X86_POP_OP, FormatOpcodeRegister}, // 0x59 - pop eCX
{X86_POP_OP, FormatOpcodeRegister}, // 0x5a - pop eDX
{X86_POP_OP, FormatOpcodeRegister}, // 0x5b - pop eBX
{X86_POP_OP, FormatOpcodeRegister}, // 0x5c - pop eSP
{X86_POP_OP, FormatOpcodeRegister}, // 0x5d - pop eBP
{X86_POP_OP, FormatOpcodeRegister}, // 0x5e - pop eSI
{X86_POP_OP, FormatOpcodeRegister}, // 0x5f - pop eDI
{X86_PUSHA_OP, FormatNoOperands}, // 0x60 - pusha
{X86_POPA_OP, FormatNoOperands}, // 0x61 - popa
{X86_BOUND_OP, FormatEffectiveOffset}, // 0x62 - bound Gv,Ma
{X86_ILL_OP, FormatNoOperands}, // 0x63 - arpl Ew,Rw
{X86_FS_OP, FormatPrefixOpcode}, // 0x64 - FS:
{X86_GS_OP, FormatPrefixOpcode}, // 0x65 - GS:
{X86_OPSZ_OP, FormatPrefixOpcode}, // 0x66 - opsize
{X86_ADSZ_OP, FormatPrefixOpcode}, // 0x67 - opaddr
{X86_PUSH_OP, FormatPushImmediate}, // 0x68 - push iv
{X86_IMUL_OP, FormatImulImmediate}, // 0x69 - imul
{X86_PUSH_OP, FormatPushImmediate}, // 0x6a - push ib
{X86_IMUL_OP, FormatImulImmediate}, // 0x6b - imul
{X86_INS_OP, FormatPortDX}, // 0x6c - insb
{X86_INS_OP, FormatPortDX}, // 0x6d - insw/d
{X86_OUTS_OP, FormatPortDX}, // 0x6e - outsb
{X86_OUTS_OP, FormatPortDX}, // 0x6f - outsw/d
{X86_JXX_OP, FormatShortJump}, // 0x70 - jo jb
{X86_JXX_OP, FormatShortJump}, // 0x71 - jno jb
{X86_JXX_OP, FormatShortJump}, // 0x72 - jb jb
{X86_JXX_OP, FormatShortJump}, // 0x73 - jnb jb
{X86_JXX_OP, FormatShortJump}, // 0x74 - jz jb
{X86_JXX_OP, FormatShortJump}, // 0x75 - jnz jb
{X86_JXX_OP, FormatShortJump}, // 0x76 - jbe jb
{X86_JXX_OP, FormatShortJump}, // 0x77 - jnbe jb
{X86_JXX_OP, FormatShortJump}, // 0x78 - js jb
{X86_JXX_OP, FormatShortJump}, // 0x79 - jns jb
{X86_JXX_OP, FormatShortJump}, // 0x7a - jp jb
{X86_JXX_OP, FormatShortJump}, // 0x7b - jnp jb
{X86_JXX_OP, FormatShortJump}, // 0x7c - jl jb
{X86_JXX_OP, FormatShortJump}, // 0x7d - jnl jb
{X86_JXX_OP, FormatShortJump}, // 0x7e - jle jb
{X86_JXX_OP, FormatShortJump}, // 0x7f - jnle jb
{X86_ADD_OP, FormatGroup1Immediate}, // 0x80 - group1 Eb,Ib
{X86_ADD_OP, FormatGroup1Immediate}, // 0x81 - group1 Ev,Iv
{X86_ILL_OP, FormatNoOperands}, // 0x82 - illegal
{X86_ADD_OP, FormatGroup1Immediate}, // 0x83 - group1 Ev,Ib
{X86_TEST_OP, FormatGroup1General}, // 0x84 - test Eb,Gb
{X86_TEST_OP, FormatGroup1General}, // 0x85 - test Ev,Gv
{X86_XCHG_OP, FormatGroup1General}, // 0x86 - xchg Eb,Gb
{X86_XCHG_OP, FormatGroup1General}, // 0x87 = xchg Ev,Gv
{X86_MOV_OP, FormatMoveGeneral}, // 0x88 - mov Eb,Gb
{X86_MOV_OP, FormatMoveGeneral}, // 0x89 - mov Ev,Gv
{X86_MOV_OP, FormatMoveGeneral}, // 0x8a - mov Gb,Eb
{X86_MOV_OP, FormatMoveGeneral}, // 0x8b - mov Gv,Ev
{X86_MOV_OP, FormatMoveSegment}, // 0x8c - mov Ew,Sw
{X86_LEA_OP, FormatEffectiveOffset}, // 0x8d - lea Gv,Ma
{X86_MOV_OP, FormatMoveSegment}, // 0x8e - mov Sw,Ew
{X86_POP_OP, FormatPopGeneral}, // 0x8f - pop Ev
{X86_NOP_OP, FormatNoOperands}, // 0x90 - nop
{X86_XCHG_OP, FormatAccumRegister}, // 0x91 - xchg eCX,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x92 - xchg eDX,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x93 - xchg eBX,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x94 - xchg eSP,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x95 - xchg eBP,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x96 - xchg eSI,eAX
{X86_XCHG_OP, FormatAccumRegister}, // 0x97 - xchg eDI,eAX
{X86_CBW_OP, FormatNoOperands}, // 0x98 - cbw
{X86_CWD_OP, FormatNoOperands}, // 0x99 - cwd
{X86_CALL_OP, FormatImmediateJump}, // 0x9a - call Ap
{X86_NOP_OP, FormatNoOperands}, // 0x9b - wait
{X86_PUSH_OP, FormatFlagsRegister}, // 0x9c - pushf
{X86_POP_OP, FormatFlagsRegister}, // 0x9d - popf
{X86_SAHF_OP, FormatNoOperands}, // 0x9e - sahf
{X86_LAHF_OP, FormatNoOperands}, // 0x9f - lahf
{X86_MOV_OP, FormatSegmentOffset}, // 0xa0 - mov AL,Ob
{X86_MOV_OP, FormatSegmentOffset}, // 0xa1 - mov eAX,Ov
{X86_MOV_OP, FormatSegmentOffset}, // 0xa2 - mov Ob,AL
{X86_MOV_OP, FormatSegmentOffset}, // 0xa3 - mov Ov,eAX
{X86_MOVS_OP, FormatStringOperands}, // 0xa4 - movsb
{X86_MOVS_OP, FormatStringOperands}, // 0xa5 - movsw/d
{X86_CMPS_OP, FormatStringOperands}, // 0xa6 - cmpsb
{X86_CMPS_OP, FormatStringOperands}, // 0xa7 - cmpsw/d
{X86_TEST_OP, FormatAccumImmediate}, // 0xa8 - test AL,Ib
{X86_TEST_OP, FormatAccumImmediate}, // 0xa9 - test eAX,Iv
{X86_STOS_OP, FormatStringOperands}, // 0xaa - stosb
{X86_STOS_OP, FormatStringOperands}, // 0xab - stosw/d
{X86_LODS_OP, FormatStringOperands}, // 0xac - lodsb
{X86_LODS_OP, FormatStringOperands}, // 0xad - lodsw.d
{X86_SCAS_OP, FormatStringOperands}, // 0xae - scasb
{X86_SCAS_OP, FormatStringOperands}, // 0xaf - scasw/d
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb0 mov AL,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb1 mov Cl,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb2 mov DL,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb3 mov BL,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb4 mov AH,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb5 mov CH,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb6 mov DH,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb7 mov BH,Ib
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb8 mov eAX,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xb9 mov eCX,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xba mov eDX,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xbb mov eBX,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xbc mov eSP,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xbd mov eBP,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xbe mov eSI,Iv
{X86_MOV_OP, FormatMoveRegImmediate}, // 0xbf mov eDI,Iv
{X86_ROL_OP, FormatGroup2ByByte}, // 0xc0 - group2 Eb,Ib
{X86_ROL_OP, FormatGroup2ByByte}, // 0xc1 - group2 Ev,Ib
{X86_RET_OP, FormatNoOperands}, // 0xc2 - ret Iw (near)
{X86_RET_OP, FormatNoOperands}, // 0xc3 - ret (near)
{X86_MOV_OP, FormatLoadSegmentES}, // 0xc4 - les Gv,Mp
{X86_MOV_OP, FormatLoadSegmentDS}, // 0xc5 - lds Gv,Mp
{X86_MOV_OP, FormatMoveImmediate}, // 0xc6 - mov Eb,Ib
{X86_MOV_OP, FormatMoveImmediate}, // 0xc7 - mov Ev,Iv
{X86_ENTER_OP, FormatImmediateEnter}, // 0xc8 - enter Iw,Ib
{X86_LEAVE_OP, FormatNoOperands}, // 0xc9 - leave
{X86_RET_OP, FormatNoOperands}, // 0xca - ret Iw (far)
{X86_RET_OP, FormatNoOperands}, // 0xcb - ret (far)
{X86_INT_OP, FormatNoOperands}, // 0xcc - int 3
{X86_INT_OP, FormatByteImmediate}, // 0xcd - int Ib
{X86_INT_OP, FormatNoOperands}, // 0xce - into
{X86_IRET_OP, FormatNoOperands}, // 0xcf - iret
{X86_ROL_OP, FormatGroup2By1}, // 0xd0 - group2 Eb,1
{X86_ROL_OP, FormatGroup2By1}, // 0xd1 - group2 Ev,1
{X86_ROL_OP, FormatGroup2ByCL}, // 0xd2 - group2 Eb,CL
{X86_ROL_OP, FormatGroup2ByCL}, // 0xd3 - group2 Ev,CL
{X86_AAM_OP, FormatByteImmediate}, // 0xd4 - aam
{X86_AAD_OP, FormatByteImmediate}, // 0xd5 - aad
{X86_ILL_OP, FormatNoOperands}, // 0xd6 - illegal
{X86_MOV_OP, FormatXlatOpcode}, // 0xd7 - xlat
{X86_ILL_OP, FormatNoOperands}, // 0xd8 - esc0
{X86_ILL_OP, FormatNoOperands}, // 0xd9 - esc1
{X86_ILL_OP, FormatNoOperands}, // 0xda - esc2
{X86_ILL_OP, FormatNoOperands}, // 0xdb - esc3
{X86_ILL_OP, FormatNoOperands}, // 0xdc - esc4
{X86_ILL_OP, FormatNoOperands}, // 0xdd - esc5
{X86_ILL_OP, FormatNoOperands}, // 0xde - esc6
{X86_ILL_OP, FormatNoOperands}, // 0xdf - esc7
{X86_LOOP_OP, FormatShortJump}, // 0xe0 - loopnz
{X86_LOOP_OP, FormatShortJump}, // 0xe1 - loopz
{X86_LOOP_OP, FormatShortJump}, // 0xe2 - loop
{X86_JCXZ_OP, FormatShortJump}, // 0xe3 - jcxz
{X86_IN_OP, FormatPortImmediate}, // 0xe4 - inb AL,Ib
{X86_IN_OP, FormatPortImmediate}, // 0xe5 - inw/d eAX,Ib
{X86_OUT_OP, FormatPortImmediate}, // 0xe6 - outb Ib,AL
{X86_OUT_OP, FormatPortImmediate}, // 0xe7 - outw/d Ib,eAX
{X86_CALL_OP, FormatLongJump}, // 0xe8 - call Jv
{X86_JMP_OP, FormatLongJump}, // 0xe9 - jmp Jv
{X86_JMP_OP, FormatImmediateJump}, // 0xea - jmp Ap
{X86_JMP_OP, FormatShortJump}, // 0xeb - jmp Jb
{X86_IN_OP, FormatPortDX}, // 0xec - inb AL,DX
{X86_IN_OP, FormatPortDX}, // 0xed - inw/d eAX,DX
{X86_OUT_OP, FormatPortDX}, // 0xee - outb Ib,DX
{X86_OUT_OP, FormatPortDX}, // 0xef - outw/d eAX,DX
{X86_LOCK_OP, FormatPrefixOpcode}, // 0xf0 - lock
{X86_ILL_OP, FormatNoOperands}, // 0xf1 - illegal
{X86_REPNZ_OP, FormatPrefixOpcode}, // 0xf2 - repnz
{X86_REPZ_OP, FormatPrefixOpcode}, // 0xf3 - repz
{X86_HLT_OP, FormatNoOperands}, // 0xf4 - hlt
{X86_CMC_OP, FormatNoOperands}, // 0xf5 - cmc
{X86_TEST_OP, FormatGroup3General}, // 0xf6 - group3 Eb,?
{X86_TEST_OP, FormatGroup3General}, // 0xf7 - group3 Ev,?
{X86_CLC_OP, FormatNoOperands}, // 0xf8 - clc
{X86_STC_OP, FormatNoOperands}, // 0xf9 - stc
{X86_CLI_OP, FormatNoOperands}, // 0xfa - cli
{X86_STI_OP, FormatNoOperands}, // 0xfb - sti
{X86_CLD_OP, FormatNoOperands}, // 0xfc - cld
{X86_STD_OP, FormatNoOperands}, // 0xfd - std
{X86_INC_OP, FormatGroup4General}, // 0xfe - group4 Eb
{X86_INC_OP, FormatGroup5General}, // 0xff - group5 Ev
};
OPCODE_CONTROL XmOpcodeControlTable2[] = {
{X86_ILL_OP, FormatNoOperands}, // 0x00 - group6
{X86_ILL_OP, FormatNoOperands}, // 0x01 - group7
{X86_ILL_OP, FormatNoOperands}, // 0x02 - lar
{X86_ILL_OP, FormatNoOperands}, // 0x03 - lsl
{X86_ILL_OP, FormatNoOperands}, // 0x04 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x05 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x06 - clts
{X86_ILL_OP, FormatNoOperands}, // 0x07 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x08 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x09 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x0f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x10 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x11 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x12 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x13 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x14 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x15 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x16 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x17 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x18 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x19 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x1f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x20 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x21 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x22 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x23 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x34 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x25 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x26 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x27 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x28 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x29 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x2f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x30 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x31 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x32 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x33 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x34 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x35 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x36 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x37 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x38 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x39 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x3f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x40 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x41 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x42 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x43 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x44 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x45 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x46 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x47 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x48 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x49 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x4f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x50 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x51 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x52 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x53 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x54 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x55 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x56 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x57 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x58 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x59 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x5f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x60 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x61 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x62 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x63 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x64 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x65 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x66 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x67 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x68 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x69 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x6f - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x70 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x71 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x72 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x73 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x74 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x75 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x76 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x77 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x78 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x79 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7a - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7b - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7c - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7d - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7e - illegal
{X86_ILL_OP, FormatNoOperands}, // 0x7f - illegal
{X86_JXX_OP, FormatLongJump}, // 0x80 - jo jv
{X86_JXX_OP, FormatLongJump}, // 0x81 - jno jv
{X86_JXX_OP, FormatLongJump}, // 0x82 - jb jv
{X86_JXX_OP, FormatLongJump}, // 0x83 - jnb jv
{X86_JXX_OP, FormatLongJump}, // 0x84 - jz jv
{X86_JXX_OP, FormatLongJump}, // 0x85 - jnz jv
{X86_JXX_OP, FormatLongJump}, // 0x86 - jbe jv
{X86_JXX_OP, FormatLongJump}, // 0x87 - jnbe jv
{X86_JXX_OP, FormatLongJump}, // 0x88 - js jv
{X86_JXX_OP, FormatLongJump}, // 0x89 - jns jv
{X86_JXX_OP, FormatLongJump}, // 0x8a - jp jv
{X86_JXX_OP, FormatLongJump}, // 0x8b - jnp jv
{X86_JXX_OP, FormatLongJump}, // 0x8c - jl jv
{X86_JXX_OP, FormatLongJump}, // 0x8d - jnl jv
{X86_JXX_OP, FormatLongJump}, // 0x8e - jle jv
{X86_JXX_OP, FormatLongJump}, // 0x8f - jnle jv
{X86_SXX_OP, FormatSetccByte}, // 0x90 - seto Eb
{X86_SXX_OP, FormatSetccByte}, // 0x91 - setno Eb
{X86_SXX_OP, FormatSetccByte}, // 0x92 - setb Eb
{X86_SXX_OP, FormatSetccByte}, // 0x93 - setnb Eb
{X86_SXX_OP, FormatSetccByte}, // 0x94 - setz Eb
{X86_SXX_OP, FormatSetccByte}, // 0x95 - setnz Eb
{X86_SXX_OP, FormatSetccByte}, // 0x96 - setbe Eb
{X86_SXX_OP, FormatSetccByte}, // 0x97 - setnbe Eb
{X86_SXX_OP, FormatSetccByte}, // 0x98 - sets Eb
{X86_SXX_OP, FormatSetccByte}, // 0x99 - setns Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9a - setp Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9b - setnp Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9c - setl Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9d - setnl Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9e - setle Eb
{X86_SXX_OP, FormatSetccByte}, // 0x9f - setnle Eb
{X86_PUSH_OP, FormatSegmentFS}, // 0xa0 - push FS
{X86_POP_OP, FormatSegmentFS}, // 0xa1 - pop FS
{X86_ILL_OP, FormatNoOperands}, // 0xa2 - illegal
{X86_BT_OP, FormatGeneralBitOffset}, // 0xa3 - bt Ev,Gv
{X86_SHLD_OP, FormatShiftDouble}, // 0xa4 - shld Ev,Gv,Ib
{X86_SHLD_OP, FormatShiftDouble}, // 0xa5 - shld Ev,Gv,cl
{X86_ILL_OP, FormatNoOperands}, // 0xa6 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xa6 - illegal
{X86_PUSH_OP, FormatSegmentGS}, // 0xa8 - push GS
{X86_POP_OP, FormatSegmentGS}, // 0xa9 - pop GS
{X86_ILL_OP, FormatNoOperands}, // 0xaa - illegal
{X86_BTS_OP, FormatGeneralBitOffset}, // 0xab - bts Ev,Gv
{X86_SHRD_OP, FormatShiftDouble}, // 0xac - shdr Ev,Gv,Ib
{X86_SHRD_OP, FormatShiftDouble}, // 0xad - shdr Rv,Gv,cl
{X86_ILL_OP, FormatNoOperands}, // 0xae - illegal
{X86_IMUL_OP, FormatGroup1General}, // 0xaf - imul Gv,Ev
{X86_CMPXCHG_OP, FormatGroup1General}, // 0xb0 - cmpxchg Eb,Gb
{X86_CMPXCHG_OP, FormatGroup1General}, // 0xb1 - cmpxchg Ev,Gv
{X86_MOV_OP, FormatLoadSegmentSS}, // 0xb2 - lss Gv,Mp
{X86_BTR_OP, FormatGeneralBitOffset}, // 0xb3 - btr Ev,Gv
{X86_MOV_OP, FormatLoadSegmentFS}, // 0xb4 - lfs Gv,Mp
{X86_MOV_OP, FormatLoadSegmentGS}, // 0xb5 - lgd Gv,Mp
{X86_MOV_OP, FormatMoveXxGeneral}, // 0xb6 - movzb Gv,Eb
{X86_MOV_OP, FormatMoveXxGeneral}, // 0xb7 - movsw Gv,Ew
{X86_ILL_OP, FormatNoOperands}, // 0xb8 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xb9 - illegal
{X86_BT_OP, FormatGroup8BitOffset}, // 0xba - group8 Ev,Ib
{X86_BTC_OP, FormatGeneralBitOffset}, // 0xbb - btc Ev,Gv
{X86_BSF_OP, FormatBitScanGeneral}, // 0xbc - bsf Gv,Ev
{X86_BSR_OP, FormatBitScanGeneral}, // 0xbd - bsr Gv,Ev
{X86_MOV_OP, FormatMoveXxGeneral}, // 0xbe - movsb Gv,Eb
{X86_MOV_OP, FormatMoveXxGeneral}, // 0xbf - movsw Gv,Ew
{X86_XADD_OP, FormatGroup1General}, // 0xc0 - xadd Eb,Gb
{X86_XADD_OP, FormatGroup1General}, // 0xc1 - xadd Ev,Gv
{X86_ILL_OP, FormatNoOperands}, // 0xc2 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xc3 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xc4 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xc5 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xc6 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xc7 - illegal
{X86_BSWAP_OP, FormatGeneralRegister}, // 0xc8 - bswap Gv
{X86_ILL_OP, FormatNoOperands}, // 0xc9 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xca - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xcb - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xcc - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xcd - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xce - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xcf - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd0 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd1 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd2 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd3 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd4 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd5 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd6 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd7 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd8 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xd9 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xda - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xdb - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xdc - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xdd - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xde - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xdf - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe0 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe1 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe2 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe3 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe4 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe5 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe6 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe7 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe8 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xe9 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xea - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xeb - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xec - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xed - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xee - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xef - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf0 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf1 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf2 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf3 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf4 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf5 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf6 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf7 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf8 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xf9 - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xfa - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xfb - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xfc - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xfd - illegal
{X86_ILL_OP, FormatNoOperands}, // 0xfe - illegal
{X86_ILL_OP, FormatNoOperands} // 0xff - illegal
};
//
// Define opcode name tables.
//
#if defined(XM_DEBUG)
PCHAR XmOpcodeNameTable1[] = {
"add Eb,Gb ", // 0x00
"add Ev,Gv ", // 0x01
"add Gb,Eb ", // 0x02
"add Gv,Ev ", // 0x03
"add AL,Ib ", // 0x04
"add eAX,Iv ", // 0x05
"push ES ", // 0x06
"pop ES ", // 0x07
"or Eb,Gb ", // 0x08
"or Ev,Gv ", // 0x09
"or Gb,Eb ", // 0x0a
"or Gv,Ev ", // 0x0b
"or AL,Ib ", // 0x0c
"or eAX,Iv ", // 0x0d
"push CS ", // 0x0e
"escape: ", // 0x0f
"adc Eb,Gb ", // 0x10
"adc Ev,Gv ", // 0x11
"adc Gb,Eb ", // 0x12
"adc Gv,Ev ", // 0x13
"adc AL,Ib ", // 0x14
"adc eAX,Iv ", // 0x15
"push SS ", // 0x16
"pop SS ", // 0x17
"sbb Eb,Gb ", // 0x18
"sbb Ev,Gv ", // 0x19
"sbb Gb,Eb ", // 0x1a
"sbb Gv,Ev ", // 0x1b
"sbb AL,Ib ", // 0x1c
"sbb eAX,Iv ", // 0x1d
"push DS ", // 0x1e
"pop DS ", // 0x1f
"and Eb,Gb ", // 0x20
"and Ev,Gv ", // 0x21
"and Gb,Eb ", // 0x22
"and Gv,Ev ", // 0x23
"and AL,Ib ", // 0x24
"and eAX,Iv ", // 0x25
"ES: ", // 0x26
"daa ", // 0x27
"sub Eb,Gb ", // 0x28
"sub Ev,Gv ", // 0x29
"sub Gb,Eb ", // 0x2a
"sub Gv,Ev ", // 0x2b
"sub AL,Ib ", // 0x2c
"sub eAX,Iv ", // 0x2d
"CS: ", // 0x2e
"das ", // 0x2f
"xor Eb,Gb ", // 0x30
"xor Ev,Gv ", // 0x31
"xor Gb,Eb ", // 0x32
"xor Gv,Ev ", // 0x33
"xor AL,Ib ", // 0x34
"xor eAX,Iv ", // 0x35
"SS: ", // 0x36
"aaa ", // 0x37
"cmp Eb,Gb ", // 0x38
"cmp Ev,Gv ", // 0x39
"cmp Gb,Eb ", // 0x3a
"cmp Gv,Ev ", // 0x3b
"cmp AL,Ib ", // 0x3c
"cmp eAX,Iv ", // 0x3d
"DS: ", // 0x3e
"aas ", // 0x3f
"inc eAX ", // 0x40
"inc eCX ", // 0x41
"inc eDX ", // 0x42
"inc eBX ", // 0x43
"inc eSP ", // 0x44
"inc eBP ", // 0x45
"inc eSI ", // 0x46
"inc eDI ", // 0x47
"dec eAX ", // 0x48
"dec eCX ", // 0x49
"dec eDX ", // 0x4a
"dec eBX ", // 0x4b
"dec eSP ", // 0x4c
"dec eBP ", // 0x4d
"dec eSI ", // 0x4e
"dec eDI ", // 0x4f
"push eAX ", // 0x50
"push eCX ", // 0x51
"push eDX ", // 0x52
"push eBX ", // 0x53
"push eSP ", // 0x54
"push eBP ", // 0x55
"push eSI ", // 0x56
"push eDI ", // 0x57
"pop eAX ", // 0x58
"pop eCX ", // 0x59
"pop eDX ", // 0x5a
"pop eBX ", // 0x5b
"pop eSP ", // 0x5c
"pop eBP ", // 0x5d
"pop eSI ", // 0x5e
"pop eDI ", // 0x5f
"pusha ", // 0x60
"popa ", // 0x61
"bound Gv,Ma ", // 0x62
"arpl Ew,Rw ", // 0x63
"FS: ", // 0x64
"GS: ", // 0x65
"opsize: ", // 0x66
"opaddr: ", // 0x67
"push Iv ", // 0x68
"imul Gv,Ev,Iv ", // 0x69
"push Ib ", // 0x6a
"imul Gv,Ev,Ib ", // 0x6b
"insb ", // 0x6c
"insw/d ", // 0x6d
"outsb ", // 0x6e
"outsw/d ", // 0x6f
"jo Jb ", // 0x70
"jno Jb ", // 0x71
"jb Jb ", // 0x72
"jnb Jb ", // 0x73
"jz Jb ", // 0x74
"jnz Jb ", // 0x75
"jbe Jb ", // 0x76
"jnbe Jb ", // 0x77
"js Jb ", // 0x78
"jns Jb ", // 0x79
"jp Jb ", // 0x7a
"jnp Jb ", // 0x7b
"jl Jb ", // 0x7c
"jnl Jb ", // 0x7d
"jle Jb ", // 0x7e
"jnle Jb ", // 0x7f
"group1 Eb,Ib ", // 0x80
"group1 Ev,Ib ", // 0x81
"illegal ", // 0x82
"group1 Ev,Ib ", // 0x83
"test Eb,Gb ", // 0x84
"test Ev,Gv ", // 0x85
"xchg Eb,Gb ", // 0x86
"xchg Ev,Gv ", // 0x87
"mov Eb,Gb ", // 0x88
"mov Ev,Gv ", // 0x89
"mov Gb,Eb ", // 0x8a
"mov Gv,Ev ", // 0x8b
"mov Ew,Sw ", // 0x8c
"lea Gv,Ma ", // 0x8d
"mov Sw,Ew ", // 0x8e
"pop Ev ", // 0x8f
"nop ", // 0x90
"xchg eCX,eAX ", // 0x91
"xchg eDX,eAX ", // 0x92
"xchg eBX,eAX ", // 0x93
"xchg eSP,eAX ", // 0x94
"xchg eBP,eAX ", // 0x95
"xchg eSI,eAX ", // 0x96
"xchg eDI,eAX ", // 0x97
"cbw ", // 0x98
"cwd ", // 0x99
"call Ap ", // 0x9a
"wait ", // 0x9b
"pushf ", // 0x9c
"popf ", // 0x9d
"sahf ", // 0x9e
"lahf ", // 0x9f
"mov AL,Ob ", // 0xa0
"mov eAX,Ov ", // 0xa1
"mov Ob,AL ", // 0xa2
"mov Ov,eAX ", // 0xa3
"movsb ", // 0xa4
"movsw/d ", // 0xa5
"cmpsb ", // 0xa6
"cmpsw/d ", // 0xa7
"test AL,Ib ", // 0xa8
"test eAX,Iv ", // 0xa9
"stosb ", // 0xaa
"stosw/d ", // 0xab
"lodsb ", // 0xac
"lodsw/d ", // 0xad
"scasb ", // 0xae
"scasw/d ", // 0xaf
"mov AL,Ib ", // 0xb0
"mov Cl,Ib ", // 0xb1
"mov DL,Ib ", // 0xb2
"mov BL,Ib ", // 0xb3
"mov AH,Ib ", // 0xb4
"mov CH,Ib ", // 0xb5
"mov DH,Ib ", // 0xb6
"mov BH,Ib ", // 0xb7
"mov eAX,Iv ", // 0xb8
"mov eCX,Iv ", // 0xb9
"mov eDX,Iv ", // 0xba
"mov eBX,Iv ", // 0xbb
"mov eSP,Iv ", // 0xbc
"mov eBP,Iv ", // 0xbd
"mov eSI,Iv ", // 0xbe
"mov eDI,Iv ", // 0xbf
"group2 Eb,Ib ", // 0xc0
"group2 Ev,Ib ", // 0xc1
"ret Iw near ", // 0xc2
"ret near ", // 0xc3
"les Gv,Mp ", // 0xc4
"lds Gv,Mp ", // 0xc5
"mov Eb,Ib ", // 0xc6
"mov Ev,Iv ", // 0xc7
"enter Iw,Ib ", // 0xc8
"leave ", // 0xc9
"ret Iw far ", // 0xca
"ret far ", // 0xcb
"int 3 ", // 0xcc
"int Ib ", // 0xcd
"into ", // 0xce
"iret ", // 0xcf
"group2 Eb,1 ", // 0xd0
"group2 Ev,1 ", // 0xd1
"group2 Eb,CL ", // 0xd2
"group2 Ev,Cl ", // 0xd3
"aam ", // 0xd4
"aad ", // 0xd5
"illegal ", // 0xd6
"xlat ", // 0xd7
"illegal ", // 0xd8
"illegal ", // 0xd9
"illegal ", // 0xda
"illegal ", // 0xdb
"illegal ", // 0xdc
"illegal ", // 0xdd
"illegal ", // 0xde
"illegal ", // 0xdf
"loopnz ", // 0xe0
"loopz ", // 0xe1
"loop ", // 0xe2
"jcxz ", // 0xe3
"inb AL,Ib ", // 0xe4
"inw/d eAX,Ib ", // 0xe5
"outb Ib,AL ", // 0xe6
"outw/d Ib,eAX ", // 0xe7
"call Jv ", // 0xe8
"jmp Jv ", // 0xe9
"jmp Ap ", // 0xea
"jmp Jb ", // 0xeb
"inb AL,DX ", // 0xec
"inw/d Ib,DX ", // 0xed
"outb DX,AL ", // 0xee
"outw/d DX,eAX ", // 0xef
"lock: ", // 0xf0
"illegal ", // 0xf1
"repnz: ", // 0xf2
"repz: ", // 0xf3
"hlt ", // 0xf4
"cmc ", // 0xf5
"group3 Eb,? ", // 0xf6
"group3 Ev,? ", // 0xf7
"clc ", // 0xf8
"stc ", // 0xf9
"cli ", // 0xfa
"sti ", // 0xfb
"cld ", // 0xfc
"std ", // 0xfd
"group4 Eb ", // 0xfe
"group5 Ev " // 0xff
};
PCHAR XmOpcodeNameTable2[] = {
"group6 ", // 0x00
"group7 ", // 0x01
"lar ", // 0x02
"lsl ", // 0x03
"illegal ", // 0x04
"illegal ", // 0x05
"clts ", // 0x06
"illegal ", // 0x07
"illegal ", // 0x08
"illegal ", // 0x09
"illegal ", // 0x0a
"illegal ", // 0x0b
"illegal ", // 0x0c
"illegal ", // 0x0d
"illegal ", // 0x0e
"illegal ", // 0x0f
"illegal ", // 0x10
"illegal ", // 0x11
"illegal ", // 0x12
"illegal ", // 0x13
"illegal ", // 0x14
"illegal ", // 0x15
"illegal ", // 0x16
"illegal ", // 0x17
"illegal ", // 0x18
"illegal ", // 0x19
"illegal ", // 0x1a
"illegal ", // 0x1b
"illegal ", // 0x1c
"illegal ", // 0x1d
"illegal ", // 0x1e
"illegal ", // 0x1f
"mov Cd,Rd ", // 0x20
"mov Dd,Rd ", // 0x21
"mov Rd,Cd ", // 0x22
"mov Rd,Dd ", // 0x23
"mov Td,Rd ", // 0x24
"illegal ", // 0x25
"mov Rd,Td ", // 0x26
"illegal ", // 0x27
"illegal ", // 0x28
"illegal ", // 0x29
"illegal ", // 0x2a
"illegal ", // 0x2b
"illegal ", // 0x2c
"illegal ", // 0x2d
"illegal ", // 0x2e
"illegal ", // 0x2f
"illegal ", // 0x30
"illegal ", // 0x31
"illegal ", // 0x32
"illegal ", // 0x33
"illegal ", // 0x34
"illegal ", // 0x35
"illegal ", // 0x36
"illegal ", // 0x37
"illegal ", // 0x38
"illegal ", // 0x39
"illegal ", // 0x3a
"illegal ", // 0x3b
"illegal ", // 0x3c
"illegal ", // 0x3d
"illegal ", // 0x3e
"illegal ", // 0x3f
"illegal ", // 0x40
"illegal ", // 0x41
"illegal ", // 0x42
"illegal ", // 0x43
"illegal ", // 0x44
"illegal ", // 0x45
"illegal ", // 0x46
"illegal ", // 0x47
"illegal ", // 0x48
"illegal ", // 0x49
"illegal ", // 0x4a
"illegal ", // 0x4b
"illegal ", // 0x4c
"illegal ", // 0x4d
"illegal ", // 0x4e
"illegal ", // 0x4f
"illegal ", // 0x50
"illegal ", // 0x51
"illegal ", // 0x52
"illegal ", // 0x53
"illegal ", // 0x54
"illegal ", // 0x55
"illegal ", // 0x56
"illegal ", // 0x57
"illegal ", // 0x58
"illegal ", // 0x59
"illegal ", // 0x5a
"illegal ", // 0x5b
"illegal ", // 0x5c
"illegal ", // 0x5d
"illegal ", // 0x5e
"illegal ", // 0x5f
"illegal ", // 0x60
"illegal ", // 0x61
"illegal ", // 0x62
"illegal ", // 0x63
"illegal ", // 0x64
"illegal ", // 0x65
"illegal ", // 0x66
"illegal ", // 0x67
"illegal ", // 0x68
"illegal ", // 0x69
"illegal ", // 0x6a
"illegal ", // 0x6b
"illegal ", // 0x6c
"illegal ", // 0x6d
"illegal ", // 0x6e
"illegal ", // 0x6f
"illegal ", // 0x70
"illegal ", // 0x71
"illegal ", // 0x72
"illegal ", // 0x73
"illegal ", // 0x74
"illegal ", // 0x75
"illegal ", // 0x76
"illegal ", // 0x77
"illegal ", // 0x78
"illegal ", // 0x79
"illegal ", // 0x7a
"illegal ", // 0x7b
"illegal ", // 0x7c
"illegal ", // 0x7d
"illegal ", // 0x7e
"illegal ", // 0x7f
"jo Jv ", // 0x80
"jno Jv ", // 0x81
"jb Jv ", // 0x82
"jnb Jv ", // 0x83
"jz Jv ", // 0x84
"jnz Jv ", // 0x85
"jbe Jv ", // 0x86
"jnbe Jv ", // 0x87
"js Jv ", // 0x88
"jns Jv ", // 0x89
"jp Jv ", // 0x8a
"jnp Jv ", // 0x8b
"jl Jv ", // 0x8c
"jnl Jv ", // 0x8d
"jle Jv ", // 0x8e
"jnle Jv ", // 0x8f
"seto ", // 0x90
"setno ", // 0x91
"setb ", // 0x92
"setnb ", // 0x93
"setz ", // 0x94
"setnz ", // 0x95
"setbe ", // 0x96
"setnbe ", // 0x97
"sets ", // 0x98
"setns ", // 0x99
"setp ", // 0x9a
"setnp ", // 0x9b
"setl ", // 0x9c
"setnl ", // 0x9d
"setle ", // 0x9e
"setnle ", // 0x9f
"push FS ", // 0xa0
"pop FS ", // 0xa1
"illegal ", // 0xa2
"bt Ev,Gv ", // 0xa3
"shld Ev,Gv,Ib ", // 0xa4
"Shld Ev,Gv,vl ", // 0xa5
"illegal ", // 0xa6
"illegal ", // 0xa7
"push GS ", // 0xa8
"pop GS ", // 0xa9
"illegal ", // 0xaa
"bts Ev,Gv ", // 0xab
"shrd Ev,Gv,Ib ", // 0xac
"shrd Ev,Gv,cl ", // 0xad
"illegal ", // 0xae
"imul Gv,Ev ", // 0xaf
"cmpxchg Eb,Gv ", // 0xb0
"cmpxchg Ev,Gv ", // 0xb1
"lss Gv,Mp ", // 0xb2
"btr Ev,Gv ", // 0xb3
"lfs Gv,Mp ", // 0xb4
"lgs Gv,Mp ", // 0xb5
"movzb Gv,Eb ", // 0xb6
"movzw Gv,Ew ", // 0xb7
"illegal ", // 0xb8
"illegal ", // 0xb9
"group8 Ev,Ib ", // 0xba
"btc Ev,Gv ", // 0xbb
"bsf Gv,Ev ", // 0xbc
"bsr Gv,Ev ", // 0xbd
"movsb Gv,Eb ", // 0xbe
"movsw Gv,Ew ", // 0xbf
"xadd Eb,Gb ", // 0xc0
"xadd Ev,Gv ", // 0xc1
"illegal ", // 0xc2
"illegal ", // 0xc3
"illegal ", // 0xc4
"illegal ", // 0xc5
"illegal ", // 0xc6
"illegal ", // 0xc7
"bswap Gv ", // 0xc8
"illegal ", // 0xc9
"illegal ", // 0xca
"illegal ", // 0xcb
"illegal ", // 0xcc
"illegal ", // 0xcd
"illegal ", // 0xce
"illegal ", // 0xcf
"illegal ", // 0xd0
"illegal ", // 0xd1
"illegal ", // 0xd2
"illegal ", // 0xd3
"illegal ", // 0xd4
"illegal ", // 0xd5
"illegal ", // 0xd6
"illegal ", // 0xd7
"illegal ", // 0xd8
"illegal ", // 0xd9
"illegal ", // 0xda
"illegal ", // 0xdb
"illegal ", // 0xdc
"illegal ", // 0xdd
"illegal ", // 0xde
"illegal ", // 0xdf
"illegal ", // 0xe0
"illegal ", // 0xe1
"illegal ", // 0xe2
"illegal ", // 0xe3
"illegal ", // 0xe4
"illegal ", // 0xe5
"illegal ", // 0xe6
"illegal ", // 0xe7
"illegal ", // 0xe8
"illegal ", // 0xe9
"illegal ", // 0xea
"illegal ", // 0xeb
"illegal ", // 0xec
"illegal ", // 0xed
"illegal ", // 0xee
"illegal ", // 0xef
"illegal ", // 0xf0
"illegal ", // 0xf1
"illegal ", // 0xf2
"illegal ", // 0xf3
"illegal ", // 0xf4
"illegal ", // 0xf5
"illegal ", // 0xf6
"illegal ", // 0xf7
"illegal ", // 0xf8
"illegal ", // 0xf9
"illegal ", // 0xfa
"illegal ", // 0xfb
"illegal ", // 0xfc
"illegal ", // 0xfd
"illegal ", // 0xfe
"illegal " // 0xff
};
ULONG XmDebugFlags = 0x00; //0x7f;
#endif