// Tables for DS: 32-bit instructions
//  (ie. no FS:, but DATA: specified)
/*++

Copyright (c) 1995 Microsoft Corporation

Module Name:

    ds16tbl.c

Abstract:
    
    Dispatch tables for instructions with DATA: override.  It is used for
    both DS: and FS: overrides.

Author:

    29-Jun-1995 BarryBo

Revision History:

--*/

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include "threadst.h"
#include "instr.h"
#include "decoderp.h"

#include "bytefns.h"
#include "wordfns.h"
#include "miscfns.h"
#include "floatfns.h"

pfnDispatchInstruction Dispatch16[256] = {
    // 0
    add_m_r8,
    add_m_r16,
    add_r_m8,
    add_r_m16,
    add_a_i8,
    add_a_i16,
    push_es,
    pop_es,
    // 8
    or_m_r8,
    or_m_r16,
    or_r_m8,
    or_r_m16,
    or_a_i8,
    or_a_i16,
    push_cs,
    dispatch216,
    // 10
    adc_m_r8,
    adc_m_r16,
    adc_r_m8,
    adc_r_m16,
    adc_a_i8,
    adc_a_i16,
    push_ss,
    pop_ss,
    // 18
    sbb_m_r8,
    sbb_m_r16,
    sbb_r_m8,
    sbb_r_m16,
    sbb_a_i8,
    sbb_a_i16,
    push_ds,
    pop_ds,
    // 20
    and_m_r8,
    and_m_r16,
    and_r_m8,
    and_r_m16,
    and_a_i8,
    and_a_i16,
    ProcessPrefixes,	// es:
    daa,
    // 28
    sub_m_r8,
    sub_m_r16,
    sub_r_m8,
    sub_r_m16,
    sub_a_i8,
    sub_a_i16,
    ProcessPrefixes,	// cs:
    das,
    // 30
    xor_m_r8,
    xor_m_r16,
    xor_r_m8,
    xor_r_m16,
    xor_a_i8,
    xor_a_i16,
    ProcessPrefixes,	// ss:
    aaa,
    // 38
    cmp_m_r8,
    cmp_m_r16,
    cmp_r_m8,
    cmp_r_m16,
    cmp_a_i8,
    cmp_a_i16,
    ProcessPrefixes,	// ds:
    aas,
    // 40
    inc_ax16,
    inc_cx16,
    inc_dx16,
    inc_bx16,
    inc_sp16,
    inc_bp16,
    inc_si16,
    inc_di16,
    // 48
    dec_ax16,
    dec_cx16,
    dec_dx16,
    dec_bx16,
    dec_sp16,
    dec_bp16,
    dec_si16,
    dec_di16,
    // 50
    push_ax16,
    push_cx16,
    push_dx16,
    push_bx16,
    push_sp16,
    push_bp16,
    push_si16,
    push_di16,
    // 58
    pop_ax16,
    pop_cx16,
    pop_dx16,
    pop_bx16,
    pop_sp16,
    pop_bp16,
    pop_si16,
    pop_di16,
    // 60
    pusha16,
    popa16,
    bound16,
    privileged, 	// arpl
    ProcessPrefixes,	// fs:
    ProcessPrefixes,	// gs:
    ProcessPrefixes,	// data: prefix
    ProcessPrefixes,	// adr: prefix
    // 68
    push_iw16,
    imul_rw_m_iw16,
    push_ibs16,
    imul_rw_m_ib16,
    privileged,     // in_ib_dx
    privileged,     // in_iw_dx
    privileged,     // out_ib_dx
    privileged,     // out_iw_dx
    // 70
    jo8,
    jno8,
    jb8,
    jae8,
    je8,
    jne8,
    jbe8,
    ja8,
    // 78
    js8,
    jns8,
    jp8,
    jnp8,
    jl8,
    jnl8,
    jle8,
    jg8,
    // 80
    GROUP_18,
    GROUP_116,
    bad,
    GROUP_1WS16,
    test_r_m8,
    test_r_m16,
    xchg_r_m8,
    xchg_r_m16,
    // 88
    mov_m_r8,
    mov_m_r16,
    mov_r_m8,
    mov_r_m16,
    mov_mw_seg,
    lea_rw_mw16,
    mov_seg_mw,
    pop_mw16,
    // 90
    nop,
    xchg_ax_cx16,
    xchg_ax_dx16,
    xchg_ax_bx16,
    xchg_ax_sp16,
    xchg_ax_bp16,
    xchg_ax_si16,
    xchg_ax_di16,
    // 98
    cbw16,
    cwd16,
    call_md,
    wait,
    pushf16,
    popf16,
    sahf,
    lahf,
    // a0
    mov_a_m8,
    mov_a_m16,
    mov_m_a8,
    mov_m_a16,
    movs8,
    movs16,
    cmps8,
    cmps16,
    // a8
    test_a_i8,
    test_a_i16,
    stos8,
    stos16,
    lods8,
    lods16,
    scas8,
    scas16,
    // b0
    mov_a_i8,
    mov_c_i8,
    mov_d_i8,
    mov_b_i8,
    mov_ah_ib,
    mov_ch_ib,
    mov_dh_ib,
    mov_bh_ib,
    // b8
    mov_a_i16,
    mov_c_i16,
    mov_d_i16,
    mov_b_i16,
    mov_sp_iw16,
    mov_bp_iw16,
    mov_si_iw16,
    mov_di_iw16,
    // c0
    GROUP_28,
    GROUP_216,
    retn_i16,
    retn16,
    les_rw_mw16,
    lds_rw_mw16,
    mov_m_i8,
    mov_m_i16,
    // c8
    enter16,
    leave16,
    retf_i16,
    retf16,
    int3,
    int_ib,
    into,
    iret,
    // d0
    GROUP_2_18,
    GROUP_2_116,
    GROUP_2_CL8,
    GROUP_2_CL16,
    aam_ib,
    aad_ib,
    bad,
    xlat,
    // d8
    FLOAT_GP0,
    FLOAT_GP1,
    FLOAT_GP2,
    FLOAT_GP3,
    FLOAT_GP4,
    FLOAT_GP5,
    FLOAT_GP6,
    FLOAT_GP7,
    // e0
    loopne_b16,
    loope_b16,
    loop_b16,
    jcxz_b16,
    privileged,     // in_al_memb
    privileged,     // in_ax_memb
    privileged,     // out_memb_al
    privileged,     // out_memb_ax
    // e8
    call_rel16,
    jmp_rel16,
    jmpf_md,
    jmp_jb,
    privileged,     // in_al_dx
    privileged,     // in_ax_dx
    privileged,     // out_dx_al
    privileged,     // out_dx_ax
    // f0
    ProcessPrefixes,	// lock: prefix
    bad,
    ProcessPrefixes,	// repnz prefix
    ProcessPrefixes,	// repz prefix
    privileged, 	// halt
    cmc,
    GROUP_38,
    GROUP_316,
    // f8
    clc,
    stc,
    privileged,     // cli
    privileged,     // sti
    cld,
    std,
    GROUP_4,
    GROUP_516
};


pfnDispatchInstruction Dispatch216[256] = {
    // 0
    GROUP_6,
    GROUP_7,
    lar16,
    lsl16,
    bad,
    bad,
    privileged,	// clts
    bad,
    // 8
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 10
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 18
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 20
    privileged,	// mov reg2W, eeeControl
    privileged,	// mov reg2W, eeeDebug
    privileged,	// mov eeeControl, reg2W
    privileged,	// mov eeeDebug, reg2W
    privileged,	// mov reg2W, eeeTest
    bad,
    privileged,	// mov eeeTest, reg2W
    bad,
    // 28
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 30
    bad,
    rdtsc,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 38
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 40
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 48
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 50
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 58
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 60
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 68
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 70
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 78
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // 80
    jo16,
    jno16,
    jb16,
    jae16,
    je16,
    jne16,
    jbe16,
    ja16,
    // 88
    js16,
    jns16,
    jp16,
    jnp16,
    jl16,
    jnl16,
    jle16,
    jg16,
    // 90
    seto_modrmb,
    setno_modrmb,
    setb_modrmb,
    setae_modrmb,
    sete_modrmb,
    setne_modrmb,
    setbe_modrmb,
    seta_modrmb,
    // 98
    sets_modrmb,
    setns_modrmb,
    setp_modrmb,
    setnp_modrmb,
    setl_modrmb,
    setge_modrmb,
    setle_modrmb,
    setg_modrmb,
    // a0
    push_fs,
    pop_fs,
    bad,
    bt_m_r16,
    shld_regw_modrmw_immb16,
    shld_regw_modrmw_cl16,
    bad,
    bad,
    // a8
    push_gs,
    pop_gs,
    bad,
    bts_m_r16,
    shrd_regw_modrmw_immb16,
    shrd_regw_modrmw_cl16,
    bad,
    imul_regw_modrmw16,
    // b0
    cmpxchg_m_r8,
    cmpxchg_m_r16,
    lss_rw_mw16,
    btr_m_r16,
    lfs_rw_mw16,
    lgs_rw_mw16,
    movzx_regw_modrmb16,
    movzx_regw_modrmw,
    // b8
    bad,
    bad,
    GROUP_816,
    btc_m_r16,
    bsf_modrmw_regw16,
    bsr_modrmw_regw16,
    movsx_regw_modrmb16,
    movsx_regw_modrmw,
    // c0
    xadd_m_r8,
    xadd_m_r16,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // c8
    bswap_eax,
    bswap_ecx,
    bswap_edx,
    bswap_ebx,
    bswap_esp,
    bswap_ebp,
    bswap_esi,
    bswap_edi,
    // d0
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // d8
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // e0
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // e8
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // f0
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    // f8
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad,
    bad
};