/****************************************************************************
*
*                       Realmode X86 Emulator Library
*
*               Copyright (C) 1996-1999 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:  Header file for public specific functions.
*               Any application linking against us should only
*               include this header
*
****************************************************************************/

#ifndef __X86EMU_X86EMU_H
#define __X86EMU_X86EMU_H

#include <asm/types.h>
#include <common.h>
#include <pci.h>
#include <asm/io.h>
#define X86API
#define X86APIP *
typedef u16 X86EMU_pioAddr;

#include "x86emu/regs.h"

/*---------------------- Macros and type definitions ----------------------*/

#if defined (CONFIG_ARM)
#define GAS_LINE_COMMENT	"@"
#elif defined(CONFIG_MIPS) || defined(CONFIG_PPC)
#define GAS_LINE_COMMENT	"#"
#elif defined (CONFIG_SH)
#define GAS_LINE_COMMENT	"!"
#endif

#define GOT2_TYPE	".got2,\"aw\"\t"GAS_LINE_COMMENT

#pragma pack(1)

/****************************************************************************
REMARKS:
Data structure containing ponters to programmed I/O functions used by the
emulator. This is used so that the user program can hook all programmed
I/O for the emulator to handled as necessary by the user program. By
default the emulator contains simple functions that do not do access the
hardware in any way. To allow the emualtor access the hardware, you will
need to override the programmed I/O functions using the X86EMU_setupPioFuncs
function.

HEADER:
x86emu.h

MEMBERS:
inb     - Function to read a byte from an I/O port
inw     - Function to read a word from an I/O port
inl     - Function to read a dword from an I/O port
outb    - Function to write a byte to an I/O port
outw    - Function to write a word to an I/O port
outl    - Function to write a dword to an I/O port
****************************************************************************/
typedef struct {
	u8(X86APIP inb) (X86EMU_pioAddr addr);
	u16(X86APIP inw) (X86EMU_pioAddr addr);
	u32(X86APIP inl) (X86EMU_pioAddr addr);
	void (X86APIP outb) (X86EMU_pioAddr addr, u8 val);
	void (X86APIP outw) (X86EMU_pioAddr addr, u16 val);
	void (X86APIP outl) (X86EMU_pioAddr addr, u32 val);
} X86EMU_pioFuncs;

/****************************************************************************
REMARKS:
Data structure containing ponters to memory access functions used by the
emulator. This is used so that the user program can hook all memory
access functions as necessary for the emulator. By default the emulator
contains simple functions that only access the internal memory of the
emulator. If you need specialised functions to handle access to different
types of memory (ie: hardware framebuffer accesses and BIOS memory access
etc), you will need to override this using the X86EMU_setupMemFuncs
function.

HEADER:
x86emu.h

MEMBERS:
rdb     - Function to read a byte from an address
rdw     - Function to read a word from an address
rdl     - Function to read a dword from an address
wrb     - Function to write a byte to an address
wrw     - Function to write a word to an address
wrl     - Function to write a dword to an address
****************************************************************************/
typedef struct {
	u8(X86APIP rdb) (u32 addr);
	u16(X86APIP rdw) (u32 addr);
	u32(X86APIP rdl) (u32 addr);
	void (X86APIP wrb) (u32 addr, u8 val);
	void (X86APIP wrw) (u32 addr, u16 val);
	void (X86APIP wrl) (u32 addr, u32 val);
} X86EMU_memFuncs;

/****************************************************************************
  Here are the default memory read and write
  function in case they are needed as fallbacks.
***************************************************************************/
extern u8 X86API rdb(u32 addr);
extern u16 X86API rdw(u32 addr);
extern u32 X86API rdl(u32 addr);
extern void X86API wrb(u32 addr, u8 val);
extern void X86API wrw(u32 addr, u16 val);
extern void X86API wrl(u32 addr, u32 val);

#pragma pack()

/*--------------------- type definitions -----------------------------------*/

typedef void (X86APIP X86EMU_intrFuncs) (int num);
extern X86EMU_intrFuncs _X86EMU_intrTab[256];

/*-------------------------- Function Prototypes --------------------------*/

#ifdef  __cplusplus
extern "C" {			/* Use "C" linkage when in C++ mode */
#endif

	void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs);
	void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs);
	void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
	void X86EMU_prepareForInt(int num);

/* decode.c */

	void X86EMU_exec(void);
	void X86EMU_halt_sys(void);

#ifdef  DEBUG
#define HALT_SYS()  \
    printf("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
    X86EMU_halt_sys()
#else
#define HALT_SYS()  X86EMU_halt_sys()
#endif

/* Debug options */

#define DEBUG_DECODE_F          0x0001	/* print decoded instruction  */
#define DEBUG_TRACE_F           0x0002	/* dump regs before/after execution */
#define DEBUG_STEP_F            0x0004
#define DEBUG_DISASSEMBLE_F     0x0008
#define DEBUG_BREAK_F           0x0010
#define DEBUG_SVC_F             0x0020
#define DEBUG_SAVE_CS_IP        0x0040
#define DEBUG_FS_F              0x0080
#define DEBUG_PROC_F            0x0100
#define DEBUG_SYSINT_F          0x0200	/* bios system interrupts. */
#define DEBUG_TRACECALL_F       0x0400
#define DEBUG_INSTRUMENT_F      0x0800
#define DEBUG_MEM_TRACE_F       0x1000
#define DEBUG_IO_TRACE_F        0x2000
#define DEBUG_TRACECALL_REGS_F  0x4000
#define DEBUG_DECODE_NOPRINT_F  0x8000
#define DEBUG_EXIT              0x10000
#define DEBUG_SYS_F             (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)

	void X86EMU_trace_regs(void);
	void X86EMU_trace_xregs(void);
	void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
	int X86EMU_trace_on(void);
	int X86EMU_trace_off(void);

#ifdef  __cplusplus
}				/* End of "C" linkage for C++       */
#endif
#endif				/* __X86EMU_X86EMU_H */
