/****************************************************************************
*
*			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 <common.h>
#include "x86emu/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)
{
    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) {
		    printk("halted\n");
		    X86EMU_trace_regs();
		    }
		else {
		    if (M.x86.debug)
			printk("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-variable 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
	printk("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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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 CONFIG_X86EMU_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.
****************************************************************************/
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.
****************************************************************************/
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);
}
