/****************************************************************************
*
*                       Realmode X86 Emulator Library
*
*               Copyright (C) 1991-2004 SciTech Software, Inc.
*                    Copyright (C) David Mosberger-Tang
*                      Copyright (C) 1999 Egbert Eich
*
*  ========================================================================
*
*  Permission to use, copy, modify, distribute, and sell this software and
*  its documentation for any purpose is hereby granted without fee,
*  provided that the above copyright notice appear in all copies and that
*  both that copyright notice and this permission notice appear in
*  supporting documentation, and that the name of the authors not be used
*  in advertising or publicity pertaining to distribution of the software
*  without specific, written prior permission.  The authors makes no
*  representations about the suitability of this software for any purpose.
*  It is provided "as is" without express or implied warranty.
*
*  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
*  PERFORMANCE OF THIS SOFTWARE.
*
*  ========================================================================
*
* Language:     ANSI C
* Environment:  Any
* Developer:    Kendall Bennett
*
* Description:  This file includes subroutines which are related to
*               instruction decoding and accessess of immediate data via IP.  etc.
*
****************************************************************************/

#include "x86emui.h"

/*----------------------------- Implementation ----------------------------*/

/****************************************************************************
REMARKS:
Handles any pending asychronous interrupts.
****************************************************************************/
static void x86emu_intr_handle(void)
{
    u8  intno;

    if (M.x86.intr & INTR_SYNCH) {
        intno = M.x86.intno;
        if (_X86EMU_intrTab[intno]) {
            (*_X86EMU_intrTab[intno])(intno);
        } else {
            push_word((u16)M.x86.R_FLG);
            CLEAR_FLAG(F_IF);
            CLEAR_FLAG(F_TF);
            push_word(M.x86.R_CS);
            M.x86.R_CS = mem_access_word(intno * 4 + 2);
            push_word(M.x86.R_IP);
            M.x86.R_IP = mem_access_word(intno * 4);
            M.x86.intr = 0;
        }
    }
}

/****************************************************************************
PARAMETERS:
intrnum - Interrupt number to raise

REMARKS:
Raise the specified interrupt to be handled before the execution of the
next instruction.
****************************************************************************/
void x86emu_intr_raise(
    u8 intrnum)
{
    printf("%s, raising exeception %x\n", __func__, intrnum);
    x86emu_dump_regs();
    M.x86.intno = intrnum;
    M.x86.intr |= INTR_SYNCH;
}

/****************************************************************************
REMARKS:
Main execution loop for the emulator. We return from here when the system
halts, which is normally caused by a stack fault when we return from the
original real mode call.
****************************************************************************/
void X86EMU_exec(void)
{
    u8 op1;

    M.x86.intr = 0;
    DB(x86emu_end_instr();)

    for (;;) {
DB(     if (CHECK_IP_FETCH())
            x86emu_check_ip_access();)
        /* If debugging, save the IP and CS values. */
        SAVE_IP_CS(M.x86.R_CS, M.x86.R_IP);
        INC_DECODED_INST_LEN(1);
        if (M.x86.intr) {
            if (M.x86.intr & INTR_HALTED) {
DB(             if (M.x86.R_SP != 0) {
                    printf("halted\n");
                    X86EMU_trace_regs();
                    }
                else {
                    if (M.x86.debug)
                        printf("Service completed successfully\n");
                    })
                return;
            }
            if (((M.x86.intr & INTR_SYNCH) && (M.x86.intno == 0 || M.x86.intno == 2)) ||
                !ACCESS_FLAG(F_IF)) {
                x86emu_intr_handle();
            }
        }
        op1 = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
        (*x86emu_optab[op1])(op1);
        //if (M.x86.debug & DEBUG_EXIT) {
        //    M.x86.debug &= ~DEBUG_EXIT;
        //    return;
        //}
    }
}

/****************************************************************************
REMARKS:
Halts the system by setting the halted system flag.
****************************************************************************/
void X86EMU_halt_sys(void)
{
    M.x86.intr |= INTR_HALTED;
}

/****************************************************************************
PARAMETERS:
mod     - Mod value from decoded byte
regh    - Reg h value from decoded byte
regl    - Reg l value from decoded byte

REMARKS:
Raise the specified interrupt to be handled before the execution of the
next instruction.

NOTE: Do not inline this function, as (*sys_rdb) is already inline!
****************************************************************************/
void fetch_decode_modrm(
    int *mod,
    int *regh,
    int *regl)
{
    int fetched;

DB( if (CHECK_IP_FETCH())
        x86emu_check_ip_access();)
    fetched = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
    INC_DECODED_INST_LEN(1);
    *mod  = (fetched >> 6) & 0x03;
    *regh = (fetched >> 3) & 0x07;
    *regl = (fetched >> 0) & 0x07;
}

/****************************************************************************
RETURNS:
Immediate byte value read from instruction queue

REMARKS:
This function returns the immediate byte from the instruction queue, and
moves the instruction pointer to the next value.

NOTE: Do not inline this function, as (*sys_rdb) is already inline!
****************************************************************************/
u8 fetch_byte_imm(void)
{
    u8 fetched;

DB( if (CHECK_IP_FETCH())
        x86emu_check_ip_access();)
    fetched = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
    INC_DECODED_INST_LEN(1);
    return fetched;
}

/****************************************************************************
RETURNS:
Immediate word value read from instruction queue

REMARKS:
This function returns the immediate byte from the instruction queue, and
moves the instruction pointer to the next value.

NOTE: Do not inline this function, as (*sys_rdw) is already inline!
****************************************************************************/
u16 fetch_word_imm(void)
{
    u16 fetched;

DB( if (CHECK_IP_FETCH())
        x86emu_check_ip_access();)
    fetched = (*sys_rdw)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP));
    M.x86.R_IP += 2;
    INC_DECODED_INST_LEN(2);
    return fetched;
}

/****************************************************************************
RETURNS:
Immediate lone value read from instruction queue

REMARKS:
This function returns the immediate byte from the instruction queue, and
moves the instruction pointer to the next value.

NOTE: Do not inline this function, as (*sys_rdw) is already inline!
****************************************************************************/
u32 fetch_long_imm(void)
{
    u32 fetched;

DB( if (CHECK_IP_FETCH())
        x86emu_check_ip_access();)
    fetched = (*sys_rdl)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP));
    M.x86.R_IP += 4;
    INC_DECODED_INST_LEN(4);
    return fetched;
}

/****************************************************************************
RETURNS:
Value of the default data segment

REMARKS:
Inline function that returns the default data segment for the current
instruction.

On the x86 processor, the default segment is not always DS if there is
no segment override. Address modes such as -3[BP] or 10[BP+SI] all refer to
addresses relative to SS (ie: on the stack). So, at the minimum, all
decodings of addressing modes would have to set/clear a bit describing
whether the access is relative to DS or SS.  That is the function of the
cpu-state-varible M.x86.mode. There are several potential states:

    repe prefix seen  (handled elsewhere)
    repne prefix seen  (ditto)

    cs segment override
    ds segment override
    es segment override
    fs segment override
    gs segment override
    ss segment override

    ds/ss select (in absense of override)

Each of the above 7 items are handled with a bit in the mode field.
****************************************************************************/
_INLINE u32 get_data_segment(void)
{
#define GET_SEGMENT(segment)
    switch (M.x86.mode & SYSMODE_SEGMASK) {
      case 0:                   /* default case: use ds register */
      case SYSMODE_SEGOVR_DS:
      case SYSMODE_SEGOVR_DS | SYSMODE_SEG_DS_SS:
        return  M.x86.R_DS;
      case SYSMODE_SEG_DS_SS:   /* non-overridden, use ss register */
        return  M.x86.R_SS;
      case SYSMODE_SEGOVR_CS:
      case SYSMODE_SEGOVR_CS | SYSMODE_SEG_DS_SS:
        return  M.x86.R_CS;
      case SYSMODE_SEGOVR_ES:
      case SYSMODE_SEGOVR_ES | SYSMODE_SEG_DS_SS:
        return  M.x86.R_ES;
      case SYSMODE_SEGOVR_FS:
      case SYSMODE_SEGOVR_FS | SYSMODE_SEG_DS_SS:
        return  M.x86.R_FS;
      case SYSMODE_SEGOVR_GS:
      case SYSMODE_SEGOVR_GS | SYSMODE_SEG_DS_SS:
        return  M.x86.R_GS;
      case SYSMODE_SEGOVR_SS:
      case SYSMODE_SEGOVR_SS | SYSMODE_SEG_DS_SS:
        return  M.x86.R_SS;
      default:
#ifdef  DEBUG
        printf("error: should not happen:  multiple overrides.\n");
#endif
        HALT_SYS();
        return 0;
    }
}

/****************************************************************************
PARAMETERS:
offset  - Offset to load data from

RETURNS:
Byte value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u8 fetch_data_byte(
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    return (*sys_rdb)((get_data_segment() << 4) + offset);
}

/****************************************************************************
PARAMETERS:
offset  - Offset to load data from

RETURNS:
Word value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u16 fetch_data_word(
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    return (*sys_rdw)((get_data_segment() << 4) + offset);
}

/****************************************************************************
PARAMETERS:
offset  - Offset to load data from

RETURNS:
Long value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u32 fetch_data_long(
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    return (*sys_rdl)((get_data_segment() << 4) + offset);
}

/****************************************************************************
PARAMETERS:
segment - Segment to load data from
offset  - Offset to load data from

RETURNS:
Byte value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u8 fetch_data_byte_abs(
    uint segment,
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    return (*sys_rdb)(((u32)segment << 4) + offset);
}

/****************************************************************************
PARAMETERS:
segment - Segment to load data from
offset  - Offset to load data from

RETURNS:
Word value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u16 fetch_data_word_abs(
    uint segment,
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    return (*sys_rdw)(((u32)segment << 4) + offset);
}

/****************************************************************************
PARAMETERS:
segment - Segment to load data from
offset  - Offset to load data from

RETURNS:
Long value read from the absolute memory location.

NOTE: Do not inline this function as (*sys_rdX) is already inline!
****************************************************************************/
u32 fetch_data_long_abs(
    uint segment,
    uint offset)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    return (*sys_rdl)(((u32)segment << 4) + offset);
}

/****************************************************************************
PARAMETERS:
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a word value to an segmented memory location. The segment used is
the current 'default' segment, which may have been overridden.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_byte(
    uint offset,
    u8 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    (*sys_wrb)((get_data_segment() << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a word value to an segmented memory location. The segment used is
the current 'default' segment, which may have been overridden.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_word(
    uint offset,
    u16 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    (*sys_wrw)((get_data_segment() << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a long value to an segmented memory location. The segment used is
the current 'default' segment, which may have been overridden.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_long(
    uint offset,
    u32 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access((u16)get_data_segment(), offset);
#endif
    (*sys_wrl)((get_data_segment() << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
segment - Segment to store data at
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a byte value to an absolute memory location.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_byte_abs(
    uint segment,
    uint offset,
    u8 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    (*sys_wrb)(((u32)segment << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
segment - Segment to store data at
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a word value to an absolute memory location.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_word_abs(
    uint segment,
    uint offset,
    u16 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    (*sys_wrw)(((u32)segment << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
segment - Segment to store data at
offset  - Offset to store data at
val     - Value to store

REMARKS:
Writes a long value to an absolute memory location.

NOTE: Do not inline this function as (*sys_wrX) is already inline!
****************************************************************************/
void store_data_long_abs(
    uint segment,
    uint offset,
    u32 val)
{
#ifdef DEBUG
    if (CHECK_DATA_ACCESS())
        x86emu_check_data_access(segment, offset);
#endif
    (*sys_wrl)(((u32)segment << 4) + offset, val);
}

/****************************************************************************
PARAMETERS:
reg - Register to decode

RETURNS:
Pointer to the appropriate register

REMARKS:
Return a pointer to the register given by the R/RM field of the
modrm byte, for byte operands. Also enables the decoding of instructions.
****************************************************************************/
u8* decode_rm_byte_register(
    int reg)
{
    switch (reg) {
      case 0:
        DECODE_PRINTF("AL");
        return &M.x86.R_AL;
      case 1:
        DECODE_PRINTF("CL");
        return &M.x86.R_CL;
      case 2:
        DECODE_PRINTF("DL");
        return &M.x86.R_DL;
      case 3:
        DECODE_PRINTF("BL");
        return &M.x86.R_BL;
      case 4:
        DECODE_PRINTF("AH");
        return &M.x86.R_AH;
      case 5:
        DECODE_PRINTF("CH");
        return &M.x86.R_CH;
      case 6:
        DECODE_PRINTF("DH");
        return &M.x86.R_DH;
      case 7:
        DECODE_PRINTF("BH");
        return &M.x86.R_BH;
    }
    HALT_SYS();
    return NULL;                /* NOT REACHED OR REACHED ON ERROR */
}

/****************************************************************************
PARAMETERS:
reg - Register to decode

RETURNS:
Pointer to the appropriate register

REMARKS:
Return a pointer to the register given by the R/RM field of the
modrm byte, for word operands.  Also enables the decoding of instructions.
****************************************************************************/
u16* decode_rm_word_register(
    int reg)
{
    switch (reg) {
      case 0:
        DECODE_PRINTF("AX");
        return &M.x86.R_AX;
      case 1:
        DECODE_PRINTF("CX");
        return &M.x86.R_CX;
      case 2:
        DECODE_PRINTF("DX");
        return &M.x86.R_DX;
      case 3:
        DECODE_PRINTF("BX");
        return &M.x86.R_BX;
      case 4:
        DECODE_PRINTF("SP");
        return &M.x86.R_SP;
      case 5:
        DECODE_PRINTF("BP");
        return &M.x86.R_BP;
      case 6:
        DECODE_PRINTF("SI");
        return &M.x86.R_SI;
      case 7:
        DECODE_PRINTF("DI");
        return &M.x86.R_DI;
    }
    HALT_SYS();
    return NULL;                /* NOTREACHED OR REACHED ON ERROR */
}

/****************************************************************************
PARAMETERS:
reg - Register to decode

RETURNS:
Pointer to the appropriate register

REMARKS:
Return a pointer to the register given by the R/RM field of the
modrm byte, for dword operands.  Also enables the decoding of instructions.
****************************************************************************/
u32* decode_rm_long_register(
    int reg)
{
    switch (reg) {
      case 0:
        DECODE_PRINTF("EAX");
        return &M.x86.R_EAX;
      case 1:
        DECODE_PRINTF("ECX");
        return &M.x86.R_ECX;
      case 2:
        DECODE_PRINTF("EDX");
        return &M.x86.R_EDX;
      case 3:
        DECODE_PRINTF("EBX");
        return &M.x86.R_EBX;
      case 4:
        DECODE_PRINTF("ESP");
        return &M.x86.R_ESP;
      case 5:
        DECODE_PRINTF("EBP");
        return &M.x86.R_EBP;
      case 6:
        DECODE_PRINTF("ESI");
        return &M.x86.R_ESI;
      case 7:
        DECODE_PRINTF("EDI");
        return &M.x86.R_EDI;
    }
    HALT_SYS();
    return NULL;                /* NOTREACHED OR REACHED ON ERROR */
}

/****************************************************************************
PARAMETERS:
reg - Register to decode

RETURNS:
Pointer to the appropriate register

REMARKS:
Return a pointer to the register given by the R/RM field of the
modrm byte, for word operands, modified from above for the weirdo
special case of segreg operands.  Also enables the decoding of instructions.
****************************************************************************/
u16* decode_rm_seg_register(
    int reg)
{
    switch (reg) {
      case 0:
        DECODE_PRINTF("ES");
        return &M.x86.R_ES;
      case 1:
        DECODE_PRINTF("CS");
        return &M.x86.R_CS;
      case 2:
        DECODE_PRINTF("SS");
        return &M.x86.R_SS;
      case 3:
        DECODE_PRINTF("DS");
        return &M.x86.R_DS;
      case 4:
        DECODE_PRINTF("FS");
        return &M.x86.R_FS;
      case 5:
        DECODE_PRINTF("GS");
        return &M.x86.R_GS;
      case 6:
      case 7:
        DECODE_PRINTF("ILLEGAL SEGREG");
        break;
    }
    HALT_SYS();
    return NULL;                /* NOT REACHED OR REACHED ON ERROR */
}

/****************************************************************************
PARAMETERS:
scale - scale value of SIB byte
index - index value of SIB byte

RETURNS:
Value of scale * index

REMARKS:
Decodes scale/index of SIB byte and returns relevant offset part of
effective address.
****************************************************************************/
static unsigned decode_sib_si(
    int scale,
    int index)
{
    scale = 1 << scale;
    if (scale > 1) {
        DECODE_PRINTF2("[%d*", scale);
    } else {
        DECODE_PRINTF("[");
    }
    switch (index) {
      case 0:
        DECODE_PRINTF("EAX]");
        return M.x86.R_EAX * index;
      case 1:
        DECODE_PRINTF("ECX]");
        return M.x86.R_ECX * index;
      case 2:
        DECODE_PRINTF("EDX]");
        return M.x86.R_EDX * index;
      case 3:
        DECODE_PRINTF("EBX]");
        return M.x86.R_EBX * index;
      case 4:
        DECODE_PRINTF("0]");
        return 0;
      case 5:
        DECODE_PRINTF("EBP]");
        return M.x86.R_EBP * index;
      case 6:
        DECODE_PRINTF("ESI]");
        return M.x86.R_ESI * index;
      case 7:
        DECODE_PRINTF("EDI]");
        return M.x86.R_EDI * index;
    }
    HALT_SYS();
    return 0;                   /* NOT REACHED OR REACHED ON ERROR */
}

/****************************************************************************
PARAMETERS:
mod - MOD value of preceding ModR/M byte

RETURNS:
Offset in memory for the address decoding

REMARKS:
Decodes SIB addressing byte and returns calculated effective address.
****************************************************************************/
static unsigned decode_sib_address(
    int mod)
{
    int sib   = fetch_byte_imm();
    int ss    = (sib >> 6) & 0x03;
    int index = (sib >> 3) & 0x07;
    int base  = sib & 0x07;
    int offset = 0;
    int displacement;

    switch (base) {
      case 0:
        DECODE_PRINTF("[EAX]");
        offset = M.x86.R_EAX;
        break;
      case 1:
        DECODE_PRINTF("[ECX]");
        offset = M.x86.R_ECX;
        break;
      case 2:
        DECODE_PRINTF("[EDX]");
        offset = M.x86.R_EDX;
        break;
      case 3:
        DECODE_PRINTF("[EBX]");
        offset = M.x86.R_EBX;
        break;
      case 4:
        DECODE_PRINTF("[ESP]");
        offset = M.x86.R_ESP;
        break;
      case 5:
        switch (mod) {
          case 0:
            displacement = (s32)fetch_long_imm();
            DECODE_PRINTF2("[%d]", displacement);
            offset = displacement;
            break;
          case 1:
            displacement = (s8)fetch_byte_imm();
            DECODE_PRINTF2("[%d][EBP]", displacement);
            offset = M.x86.R_EBP + displacement;
            break;
          case 2:
            displacement = (s32)fetch_long_imm();
            DECODE_PRINTF2("[%d][EBP]", displacement);
            offset = M.x86.R_EBP + displacement;
            break;
          default:
            HALT_SYS();
        }
        DECODE_PRINTF("[EAX]");
        offset = M.x86.R_EAX;
        break;
      case 6:
        DECODE_PRINTF("[ESI]");
        offset = M.x86.R_ESI;
        break;
      case 7:
        DECODE_PRINTF("[EDI]");
        offset = M.x86.R_EDI;
        break;
      default:
        HALT_SYS();
    }
    offset += decode_sib_si(ss, index);
    return offset;
}

/****************************************************************************
PARAMETERS:
rm  - RM value to decode

RETURNS:
Offset in memory for the address decoding

REMARKS:
Return the offset given by mod=00 addressing.  Also enables the
decoding of instructions.

NOTE:   The code which specifies the corresponding segment (ds vs ss)
        below in the case of [BP+..].  The assumption here is that at the
        point that this subroutine is called, the bit corresponding to
        SYSMODE_SEG_DS_SS will be zero.  After every instruction
        except the segment override instructions, this bit (as well
        as any bits indicating segment overrides) will be clear.  So
        if a SS access is needed, set this bit.  Otherwise, DS access
        occurs (unless any of the segment override bits are set).
****************************************************************************/
unsigned decode_rm00_address(
    int rm)
{
    unsigned offset;

    if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
        /* 32-bit addressing */
        switch (rm) {
          case 0:
            DECODE_PRINTF("[EAX]");
            return M.x86.R_EAX;
          case 1:
            DECODE_PRINTF("[ECX]");
            return M.x86.R_ECX;
          case 2:
            DECODE_PRINTF("[EDX]");
            return M.x86.R_EDX;
          case 3:
            DECODE_PRINTF("[EBX]");
            return M.x86.R_EBX;
          case 4:
            return decode_sib_address(0);
          case 5:
            offset = fetch_long_imm();
            DECODE_PRINTF2("[%08x]", offset);
            return offset;
          case 6:
            DECODE_PRINTF("[ESI]");
            return M.x86.R_ESI;
          case 7:
            DECODE_PRINTF("[EDI]");
            return M.x86.R_EDI;
        }
    } else {
        /* 16-bit addressing */
        switch (rm) {
          case 0:
            DECODE_PRINTF("[BX+SI]");
            return (M.x86.R_BX + M.x86.R_SI) & 0xffff;
          case 1:
            DECODE_PRINTF("[BX+DI]");
            return (M.x86.R_BX + M.x86.R_DI) & 0xffff;
          case 2:
            DECODE_PRINTF("[BP+SI]");
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_SI) & 0xffff;
          case 3:
            DECODE_PRINTF("[BP+DI]");
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_DI) & 0xffff;
          case 4:
            DECODE_PRINTF("[SI]");
            return M.x86.R_SI;
          case 5:
            DECODE_PRINTF("[DI]");
            return M.x86.R_DI;
          case 6:
            offset = fetch_word_imm();
            DECODE_PRINTF2("[%04x]", offset);
            return offset;
          case 7:
            DECODE_PRINTF("[BX]");
            return M.x86.R_BX;
        }
    }
    HALT_SYS();
    return 0;
}

/****************************************************************************
PARAMETERS:
rm  - RM value to decode

RETURNS:
Offset in memory for the address decoding

REMARKS:
Return the offset given by mod=01 addressing.  Also enables the
decoding of instructions.
****************************************************************************/
unsigned decode_rm01_address(
    int rm)
{
    int displacement;

    if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
        /* 32-bit addressing */
        if (rm != 4)
            displacement = (s8)fetch_byte_imm();
        else
            displacement = 0;

        switch (rm) {
          case 0:
            DECODE_PRINTF2("%d[EAX]", displacement);
            return M.x86.R_EAX + displacement;
          case 1:
            DECODE_PRINTF2("%d[ECX]", displacement);
            return M.x86.R_ECX + displacement;
          case 2:
            DECODE_PRINTF2("%d[EDX]", displacement);
            return M.x86.R_EDX + displacement;
          case 3:
            DECODE_PRINTF2("%d[EBX]", displacement);
            return M.x86.R_EBX + displacement;
          case 4: {
            int offset = decode_sib_address(1);
            displacement = (s8)fetch_byte_imm();
            DECODE_PRINTF2("[%d]", displacement);
            return offset + displacement;
          }
          case 5:
            DECODE_PRINTF2("%d[EBP]", displacement);
            return M.x86.R_EBP + displacement;
          case 6:
            DECODE_PRINTF2("%d[ESI]", displacement);
            return M.x86.R_ESI + displacement;
          case 7:
            DECODE_PRINTF2("%d[EDI]", displacement);
            return M.x86.R_EDI + displacement;
        }
    } else {
        /* 16-bit addressing */
        displacement = (s8)fetch_byte_imm();
        switch (rm) {
          case 0:
            DECODE_PRINTF2("%d[BX+SI]", displacement);
            return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
          case 1:
            DECODE_PRINTF2("%d[BX+DI]", displacement);
            return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
          case 2:
            DECODE_PRINTF2("%d[BP+SI]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
          case 3:
            DECODE_PRINTF2("%d[BP+DI]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
          case 4:
            DECODE_PRINTF2("%d[SI]", displacement);
            return (M.x86.R_SI + displacement) & 0xffff;
          case 5:
            DECODE_PRINTF2("%d[DI]", displacement);
            return (M.x86.R_DI + displacement) & 0xffff;
          case 6:
            DECODE_PRINTF2("%d[BP]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + displacement) & 0xffff;
          case 7:
            DECODE_PRINTF2("%d[BX]", displacement);
            return (M.x86.R_BX + displacement) & 0xffff;
        }
    }
    HALT_SYS();
    return 0;                   /* SHOULD NOT HAPPEN */
}

/****************************************************************************
PARAMETERS:
rm  - RM value to decode

RETURNS:
Offset in memory for the address decoding

REMARKS:
Return the offset given by mod=10 addressing.  Also enables the
decoding of instructions.
****************************************************************************/
unsigned decode_rm10_address(
    int rm)
{
    if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
        int displacement;

        /* 32-bit addressing */
        if (rm != 4)
            displacement = (s32)fetch_long_imm();
        else
            displacement = 0;

        switch (rm) {
          case 0:
            DECODE_PRINTF2("%d[EAX]", displacement);
            return M.x86.R_EAX + displacement;
          case 1:
            DECODE_PRINTF2("%d[ECX]", displacement);
            return M.x86.R_ECX + displacement;
          case 2:
            DECODE_PRINTF2("%d[EDX]", displacement);
            return M.x86.R_EDX + displacement;
          case 3:
            DECODE_PRINTF2("%d[EBX]", displacement);
            return M.x86.R_EBX + displacement;
          case 4: {
            int offset = decode_sib_address(2);
            displacement = (s32)fetch_long_imm();
            DECODE_PRINTF2("[%d]", displacement);
            return offset + displacement;
          }
          case 5:
            DECODE_PRINTF2("%d[EBP]", displacement);
            return M.x86.R_EBP + displacement;
          case 6:
            DECODE_PRINTF2("%d[ESI]", displacement);
            return M.x86.R_ESI + displacement;
          case 7:
            DECODE_PRINTF2("%d[EDI]", displacement);
            return M.x86.R_EDI + displacement;
        }
    } else {
        int displacement = (s16)fetch_word_imm();

        /* 16-bit addressing */
        switch (rm) {
          case 0:
            DECODE_PRINTF2("%d[BX+SI]", displacement);
            return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
          case 1:
            DECODE_PRINTF2("%d[BX+DI]", displacement);
            return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
          case 2:
            DECODE_PRINTF2("%d[BP+SI]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
          case 3:
            DECODE_PRINTF2("%d[BP+DI]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
          case 4:
            DECODE_PRINTF2("%d[SI]", displacement);
            return (M.x86.R_SI + displacement) & 0xffff;
          case 5:
            DECODE_PRINTF2("%d[DI]", displacement);
            return (M.x86.R_DI + displacement) & 0xffff;
          case 6:
            DECODE_PRINTF2("%d[BP]", displacement);
            M.x86.mode |= SYSMODE_SEG_DS_SS;
            return (M.x86.R_BP + displacement) & 0xffff;
          case 7:
            DECODE_PRINTF2("%d[BX]", displacement);
            return (M.x86.R_BX + displacement) & 0xffff;
        }
    }
    HALT_SYS();
    return 0;                   /* SHOULD NOT HAPPEN */
}


/****************************************************************************
PARAMETERS:
mod - modifier
rm  - RM value to decode

RETURNS:
Offset in memory for the address decoding, multiplexing calls to
the decode_rmXX_address functions

REMARKS:
Return the offset given by "mod" addressing.
****************************************************************************/

unsigned decode_rmXX_address(int mod, int rm)
{
  if(mod == 0)
    return decode_rm00_address(rm);
  if(mod == 1)
    return decode_rm01_address(rm);
  return decode_rm10_address(rm);
}



