added missing includes for x86 emulator
This commit is contained in:
3
Makefile
3
Makefile
@@ -117,6 +117,9 @@ CSRCS= \
|
|||||||
radeon_monitor.c \
|
radeon_monitor.c \
|
||||||
\
|
\
|
||||||
biosemu.c \
|
biosemu.c \
|
||||||
|
decode.c \
|
||||||
|
sys.c \
|
||||||
|
debug.c \
|
||||||
\
|
\
|
||||||
basflash.c \
|
basflash.c \
|
||||||
basflash_start.c
|
basflash_start.c
|
||||||
|
|||||||
@@ -87,6 +87,9 @@ SECTIONS
|
|||||||
OBJDIR/offscreen.o
|
OBJDIR/offscreen.o
|
||||||
|
|
||||||
OBJDIR/biosemu.o
|
OBJDIR/biosemu.o
|
||||||
|
OBJDIR/decode.o
|
||||||
|
OBJDIR/sys.o
|
||||||
|
OBJDIR/debug.o
|
||||||
|
|
||||||
OBJDIR/radeon_base.o
|
OBJDIR/radeon_base.o
|
||||||
OBJDIR/radeon_accel.o
|
OBJDIR/radeon_accel.o
|
||||||
|
|||||||
237
include/x86debug.h
Normal file
237
include/x86debug.h
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 debug definitions.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/debug.h,v 1.4 2000/11/21 23:10:27 tsi Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* for the X86 emulator, debug cannot be enabled and disabled on a per-file mode
|
||||||
|
* as with all the other modules. It must be centrally enabled here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "bas_printf.h"
|
||||||
|
|
||||||
|
#define DBG_X86EMU
|
||||||
|
|
||||||
|
#ifdef DBG_X86EMU
|
||||||
|
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
|
||||||
|
#else
|
||||||
|
#define dbg(format, arg...) do { ; } while (0)
|
||||||
|
#endif /* DBG_X86EMU */
|
||||||
|
|
||||||
|
#ifndef __X86EMU_DEBUG_H
|
||||||
|
#define __X86EMU_DEBUG_H
|
||||||
|
|
||||||
|
/*---------------------- Macros and type definitions ----------------------*/
|
||||||
|
|
||||||
|
/* checks to be enabled for "runtime" */
|
||||||
|
|
||||||
|
#define CHECK_IP_FETCH_F 0x1
|
||||||
|
#define CHECK_SP_ACCESS_F 0x2
|
||||||
|
#define CHECK_MEM_ACCESS_F 0x4 /*using regular linear pointer */
|
||||||
|
#define CHECK_DATA_ACCESS_F 0x8 /*using segment:offset*/
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define CHECK_IP_FETCH() (M.x86.check & CHECK_IP_FETCH_F)
|
||||||
|
# define CHECK_SP_ACCESS() (M.x86.check & CHECK_SP_ACCESS_F)
|
||||||
|
# define CHECK_MEM_ACCESS() (M.x86.check & CHECK_MEM_ACCESS_F)
|
||||||
|
# define CHECK_DATA_ACCESS() (M.x86.check & CHECK_DATA_ACCESS_F)
|
||||||
|
#else
|
||||||
|
# define CHECK_IP_FETCH()
|
||||||
|
# define CHECK_SP_ACCESS()
|
||||||
|
# define CHECK_MEM_ACCESS()
|
||||||
|
# define CHECK_DATA_ACCESS()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define DEBUG_INSTRUMENT() (M.x86.debug & DEBUG_INSTRUMENT_F)
|
||||||
|
# define DEBUG_DECODE() (M.x86.debug & DEBUG_DECODE_F)
|
||||||
|
# define DEBUG_TRACE() (M.x86.debug & DEBUG_TRACE_F)
|
||||||
|
# define DEBUG_STEP() (M.x86.debug & DEBUG_STEP_F)
|
||||||
|
# define DEBUG_DISASSEMBLE() (M.x86.debug & DEBUG_DISASSEMBLE_F)
|
||||||
|
# define DEBUG_BREAK() (M.x86.debug & DEBUG_BREAK_F)
|
||||||
|
# define DEBUG_SVC() (M.x86.debug & DEBUG_SVC_F)
|
||||||
|
# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_IP_CS_F)
|
||||||
|
|
||||||
|
# define DEBUG_FS() (M.x86.debug & DEBUG_FS_F)
|
||||||
|
# define DEBUG_PROC() (M.x86.debug & DEBUG_PROC_F)
|
||||||
|
# define DEBUG_SYSINT() (M.x86.debug & DEBUG_SYSINT_F)
|
||||||
|
# define DEBUG_TRACECALL() (M.x86.debug & DEBUG_TRACECALL_F)
|
||||||
|
# define DEBUG_TRACECALLREGS() (M.x86.debug & DEBUG_TRACECALL_REGS_F)
|
||||||
|
# define DEBUG_SYS() (M.x86.debug & DEBUG_SYS_F)
|
||||||
|
# define DEBUG_MEM_TRACE() (M.x86.debug & DEBUG_MEM_TRACE_F)
|
||||||
|
# define DEBUG_IO_TRACE() (M.x86.debug & DEBUG_IO_TRACE_F)
|
||||||
|
# define DEBUG_DECODE_NOPRINT() (M.x86.debug & DEBUG_DECODE_NOPRINT_F)
|
||||||
|
#else
|
||||||
|
# define DEBUG_INSTRUMENT() 0
|
||||||
|
# define DEBUG_DECODE() 0
|
||||||
|
# define DEBUG_TRACE() 0
|
||||||
|
# define DEBUG_STEP() 0
|
||||||
|
# define DEBUG_DISASSEMBLE() 0
|
||||||
|
# define DEBUG_BREAK() 0
|
||||||
|
# define DEBUG_SVC() 0
|
||||||
|
# define DEBUG_SAVE_IP_CS() 0
|
||||||
|
# define DEBUG_FS() 0
|
||||||
|
# define DEBUG_PROC() 0
|
||||||
|
# define DEBUG_SYSINT() 0
|
||||||
|
# define DEBUG_TRACECALL() 0
|
||||||
|
# define DEBUG_TRACECALLREGS() 0
|
||||||
|
# define DEBUG_SYS() 0
|
||||||
|
# define DEBUG_MEM_TRACE() 0
|
||||||
|
# define DEBUG_IO_TRACE() 0
|
||||||
|
# define DEBUG_DECODE_NOPRINT() 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
# define DECODE_PRINTF(x) if (DEBUG_DECODE()) \
|
||||||
|
x86emu_decode_printf(x)
|
||||||
|
# define DECODE_PRINTF2(x,y) if (DEBUG_DECODE()) \
|
||||||
|
x86emu_decode_printf2(x,y)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following allow us to look at the bytes of an instruction. The
|
||||||
|
* first INCR_INSTRN_LEN, is called everytime bytes are consumed in
|
||||||
|
* the decoding process. The SAVE_IP_CS is called initially when the
|
||||||
|
* major opcode of the instruction is accessed.
|
||||||
|
*/
|
||||||
|
#define INC_DECODED_INST_LEN(x) \
|
||||||
|
if (DEBUG_DECODE()) \
|
||||||
|
x86emu_inc_decoded_inst_len(x)
|
||||||
|
|
||||||
|
#define SAVE_IP_CS(x,y) \
|
||||||
|
if (DEBUG_DECODE() | DEBUG_TRACECALL() | DEBUG_BREAK() \
|
||||||
|
| DEBUG_IO_TRACE() | DEBUG_SAVE_IP_CS()) { \
|
||||||
|
M.x86.saved_cs = x; \
|
||||||
|
M.x86.saved_ip = y; \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define INC_DECODED_INST_LEN(x)
|
||||||
|
# define DECODE_PRINTF(x)
|
||||||
|
# define DECODE_PRINTF2(x,y)
|
||||||
|
# define SAVE_IP_CS(x,y)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define TRACE_REGS() \
|
||||||
|
if (DEBUG_DISASSEMBLE()) { \
|
||||||
|
x86emu_just_disassemble(); \
|
||||||
|
goto EndOfTheInstructionProcedure; \
|
||||||
|
} \
|
||||||
|
if (DEBUG_TRACE() || DEBUG_DECODE()) X86EMU_trace_regs()
|
||||||
|
#else
|
||||||
|
# define TRACE_REGS()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define SINGLE_STEP() if (DEBUG_STEP()) x86emu_single_step()
|
||||||
|
#else
|
||||||
|
# define SINGLE_STEP()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TRACE_AND_STEP() \
|
||||||
|
TRACE_REGS(); \
|
||||||
|
SINGLE_STEP()
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define START_OF_INSTR()
|
||||||
|
# define END_OF_INSTR() EndOfTheInstructionProcedure: x86emu_end_instr();
|
||||||
|
# define END_OF_INSTR_NO_TRACE() x86emu_end_instr();
|
||||||
|
#else
|
||||||
|
# define START_OF_INSTR()
|
||||||
|
# define END_OF_INSTR()
|
||||||
|
# define END_OF_INSTR_NO_TRACE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define CALL_TRACE(u,v,w,x,s) \
|
||||||
|
if (DEBUG_TRACECALLREGS()) \
|
||||||
|
x86emu_dump_regs(); \
|
||||||
|
if (DEBUG_TRACECALL()) { \
|
||||||
|
DPRINTVALHEXWORD("", u); \
|
||||||
|
DPRINTVALHEXWORD(":", v); \
|
||||||
|
DPRINT(": CALL "); \
|
||||||
|
DPRINT(s); \
|
||||||
|
DPRINTVALHEXWORD("", w); \
|
||||||
|
DPRINTVALHEXWORD(":", x); \
|
||||||
|
DPRINT("\r\n"); }
|
||||||
|
# define RETURN_TRACE(n,u,v) \
|
||||||
|
if (DEBUG_TRACECALLREGS()) \
|
||||||
|
x86emu_dump_regs(); \
|
||||||
|
if (DEBUG_TRACECALL()) { \
|
||||||
|
DPRINTVALHEXWORD("", (unsigned long)u); \
|
||||||
|
DPRINTVALHEXWORD(":", (unsigned long)v); \
|
||||||
|
DPRINT(": CALL "); \
|
||||||
|
DPRINT(n); \
|
||||||
|
DPRINT("\r\n"); }
|
||||||
|
#else
|
||||||
|
# define CALL_TRACE(u,v,w,x,s)
|
||||||
|
# define RETURN_TRACE(n,u,v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define DB(x) x
|
||||||
|
#else
|
||||||
|
#define DB(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------- Function Prototypes --------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void x86emu_inc_decoded_inst_len (int x);
|
||||||
|
extern void x86emu_decode_printf (char *x);
|
||||||
|
extern void x86emu_decode_printf2 (char *x, int y);
|
||||||
|
extern void x86emu_just_disassemble (void);
|
||||||
|
extern void x86emu_single_step (void);
|
||||||
|
extern void x86emu_end_instr (void);
|
||||||
|
extern void x86emu_dump_regs (void);
|
||||||
|
extern void x86emu_dump_xregs (void);
|
||||||
|
extern void x86emu_print_int_vect (uint16_t iv);
|
||||||
|
extern void x86emu_instrument_instruction (void);
|
||||||
|
extern void x86emu_check_ip_access (void);
|
||||||
|
extern void x86emu_check_sp_access (void);
|
||||||
|
extern void x86emu_check_mem_access (uint32_t p);
|
||||||
|
extern void x86emu_check_data_access (unsigned int s, unsigned int o);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of "C" linkage for C++ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_DEBUG_H */
|
||||||
89
include/x86decode.h
Normal file
89
include/x86decode.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 instruction decoding logic.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __X86EMU_DECODE_H
|
||||||
|
#define __X86EMU_DECODE_H
|
||||||
|
|
||||||
|
/*---------------------- Macros and type definitions ----------------------*/
|
||||||
|
|
||||||
|
/* Instruction Decoding Stuff */
|
||||||
|
|
||||||
|
#define FETCH_DECODE_MODRM(mod,rh,rl) fetch_decode_modrm(&mod,&rh,&rl)
|
||||||
|
#define DECODE_RM_BYTE_REGISTER(r) decode_rm_byte_register(r)
|
||||||
|
#define DECODE_RM_WORD_REGISTER(r) decode_rm_word_register(r)
|
||||||
|
#define DECODE_RM_LONG_REGISTER(r) decode_rm_long_register(r)
|
||||||
|
#define DECODE_CLEAR_SEGOVR() M.x86.mode &= ~SYSMODE_CLRMASK
|
||||||
|
|
||||||
|
/*-------------------------- Function Prototypes --------------------------*/
|
||||||
|
|
||||||
|
#include "bas_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void x86emu_intr_raise(uint8_t type);
|
||||||
|
void fetch_decode_modrm(int *mod, int *regh, int *regl);
|
||||||
|
uint8_t fetch_byte_imm(void);
|
||||||
|
uint16_t fetch_word_imm(void);
|
||||||
|
uint32_t fetch_long_imm(void);
|
||||||
|
uint8_t fetch_data_byte(unsigned int offset);
|
||||||
|
uint8_t fetch_data_byte_abs(unsigned int segment, unsigned int offset);
|
||||||
|
uint16_t fetch_data_word(unsigned int offset);
|
||||||
|
uint16_t fetch_data_word_abs(unsigned int segment, unsigned int offset);
|
||||||
|
uint32_t fetch_data_long(unsigned int offset);
|
||||||
|
uint32_t fetch_data_long_abs(unsigned int segment, unsigned int offset);
|
||||||
|
void store_data_byte(unsigned int offset, uint8_t val);
|
||||||
|
void store_data_byte_abs(unsigned int segment, unsigned int offset, uint8_t val);
|
||||||
|
void store_data_word(unsigned int offset, uint16_t val);
|
||||||
|
void store_data_word_abs(unsigned int segment, unsigned int offset, uint16_t val);
|
||||||
|
void store_data_long(unsigned int offset, uint32_t val);
|
||||||
|
void store_data_long_abs(unsigned int segment, unsigned int offset, uint32_t val);
|
||||||
|
uint8_t *decode_rm_byte_register(int reg);
|
||||||
|
uint16_t *decode_rm_word_register(int reg);
|
||||||
|
uint32_t *decode_rm_long_register(int reg);
|
||||||
|
uint16_t *decode_rm_seg_register(int reg);
|
||||||
|
unsigned decode_rm00_address(int rm);
|
||||||
|
unsigned decode_rm01_address(int rm);
|
||||||
|
unsigned decode_rm10_address(int rm);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of "C" linkage for C++ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_DECODE_H */
|
||||||
105
include/x86emui.h
Normal file
105
include/x86emui.h
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 system specific functions. These functions
|
||||||
|
* are always compiled and linked in the OS depedent libraries,
|
||||||
|
* and never in a binary portable driver.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/x86emui.h,v 1.4 2001/04/01 13:59:58 tsi Exp $ */
|
||||||
|
|
||||||
|
#ifndef __X86EMU_X86EMUI_H
|
||||||
|
#define __X86EMU_X86EMUI_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are compiling in C++ mode, we can compile some functions as
|
||||||
|
* inline to increase performance (however the code size increases quite
|
||||||
|
* dramatically in this case).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__cplusplus) && !defined(_NO_INLINE)
|
||||||
|
#define _INLINE inline
|
||||||
|
#else
|
||||||
|
#define _INLINE static
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get rid of unused parameters in C++ compilation mode */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define X86EMU_UNUSED(v)
|
||||||
|
#else
|
||||||
|
#define X86EMU_UNUSED(v) v
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "radeonfb.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG_X86EMU
|
||||||
|
#define DEBUG /* => see also sys.c */
|
||||||
|
#else
|
||||||
|
#undef DEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "x86emu.h"
|
||||||
|
#include "x86regs.h"
|
||||||
|
#include "x86decode.h"
|
||||||
|
#include "x86ops.h"
|
||||||
|
#include "x86prim_ops.h"
|
||||||
|
#include "x86fpu.h"
|
||||||
|
|
||||||
|
/*--------------------------- Inline Functions ----------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t (X86APIP sys_rdb)(uint32_t addr);
|
||||||
|
extern uint16_t (X86APIP sys_rdw)(uint32_t addr);
|
||||||
|
extern uint32_t (X86APIP sys_rdl)(uint32_t addr);
|
||||||
|
extern void (X86APIP sys_wrb)(uint32_t addr,uint8_t val);
|
||||||
|
extern void (X86APIP sys_wrw)(uint32_t addr,uint16_t val);
|
||||||
|
extern void (X86APIP sys_wrl)(uint32_t addr,uint32_t val);
|
||||||
|
|
||||||
|
extern uint8_t (X86APIP sys_inb)(X86EMU_pioAddr addr);
|
||||||
|
extern uint16_t (X86APIP sys_inw)(X86EMU_pioAddr addr);
|
||||||
|
extern uint32_t (X86APIP sys_inl)(X86EMU_pioAddr addr);
|
||||||
|
extern void (X86APIP sys_outb)(X86EMU_pioAddr addr,uint8_t val);
|
||||||
|
extern void (X86APIP sys_outw)(X86EMU_pioAddr addr,uint16_t val);
|
||||||
|
extern void (X86APIP sys_outl)(X86EMU_pioAddr addr,uint32_t val);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of "C" linkage for C++ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_X86EMUI_H */
|
||||||
61
include/x86fpu.h
Normal file
61
include/x86fpu.h
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 FPU instruction decoding.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __X86EMU_FPU_H
|
||||||
|
#define __X86EMU_FPU_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* these have to be defined, whether 8087 support compiled in or not. */
|
||||||
|
|
||||||
|
extern void x86emuOp_esc_coprocess_d8 (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_d9 (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_da (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_db (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_dc (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_dd (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_de (uint8_t op1);
|
||||||
|
extern void x86emuOp_esc_coprocess_df (uint8_t op1);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of "C" linkage for C++ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_FPU_H */
|
||||||
45
include/x86ops.h
Normal file
45
include/x86ops.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 operand decoding functions.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __X86EMU_OPS_H
|
||||||
|
#define __X86EMU_OPS_H
|
||||||
|
|
||||||
|
extern void (*x86emu_optab[0x100])(uint8_t op1);
|
||||||
|
extern void (*x86emu_optab2[0x100])(uint8_t op2);
|
||||||
|
|
||||||
|
#endif /* __X86EMU_OPS_H */
|
||||||
971
include/x86prim_asm.h
Normal file
971
include/x86prim_asm.h
Normal file
@@ -0,0 +1,971 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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: Watcom C++ 10.6 or later
|
||||||
|
* Environment: Any
|
||||||
|
* Developer: Kendall Bennett
|
||||||
|
*
|
||||||
|
* Description: Inline assembler versions of the primitive operand
|
||||||
|
* functions for faster performance. At the moment this is
|
||||||
|
* x86 inline assembler, but these functions could be replaced
|
||||||
|
* with native inline assembler for each supported processor
|
||||||
|
* platform.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/prim_asm.h,v 1.3 2000/04/19 15:48:15 tsi Exp $ */
|
||||||
|
|
||||||
|
#ifndef __X86EMU_PRIM_ASM_H
|
||||||
|
#define __X86EMU_PRIM_ASM_H
|
||||||
|
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
|
||||||
|
#ifndef VALIDATE
|
||||||
|
#define __HAVE_INLINE_ASSEMBLER__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
u32 get_flags_asm(void);
|
||||||
|
#pragma aux get_flags_asm = \
|
||||||
|
"pushf" \
|
||||||
|
"pop eax" \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax];
|
||||||
|
|
||||||
|
u16 aaa_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux aaa_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"aaa" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u16 aas_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux aas_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"aas" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u16 aad_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux aad_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"aad" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u16 aam_word_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux aam_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"aam" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u8 adc_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux adc_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"adc al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 adc_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux adc_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"adc ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 adc_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux adc_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"adc eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 add_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux add_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"add al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 add_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux add_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"add ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 add_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux add_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"add eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 and_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux and_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"and al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 and_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux and_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"and ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 and_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux and_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"and eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 cmp_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux cmp_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"cmp al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 cmp_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux cmp_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"cmp ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 cmp_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux cmp_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"cmp eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 daa_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux daa_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"daa" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u8 das_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux das_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"das" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u8 dec_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux dec_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"dec al" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u16 dec_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux dec_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"dec ax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u32 dec_long_asm(u32 *flags,u32 d);
|
||||||
|
#pragma aux dec_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"dec eax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax];
|
||||||
|
|
||||||
|
u8 inc_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux inc_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"inc al" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u16 inc_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux inc_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"inc ax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u32 inc_long_asm(u32 *flags,u32 d);
|
||||||
|
#pragma aux inc_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"inc eax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax];
|
||||||
|
|
||||||
|
u8 or_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux or_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"or al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 or_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux or_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"or ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 or_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux or_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"or eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 neg_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux neg_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"neg al" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u16 neg_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux neg_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"neg ax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u32 neg_long_asm(u32 *flags,u32 d);
|
||||||
|
#pragma aux neg_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"neg eax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax];
|
||||||
|
|
||||||
|
u8 not_byte_asm(u32 *flags,u8 d);
|
||||||
|
#pragma aux not_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"not al" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al];
|
||||||
|
|
||||||
|
u16 not_word_asm(u32 *flags,u16 d);
|
||||||
|
#pragma aux not_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"not ax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax];
|
||||||
|
|
||||||
|
u32 not_long_asm(u32 *flags,u32 d);
|
||||||
|
#pragma aux not_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"not eax" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax];
|
||||||
|
|
||||||
|
u8 rcl_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux rcl_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcl al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 rcl_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux rcl_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcl ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 rcl_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux rcl_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcl eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 rcr_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux rcr_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcr al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 rcr_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux rcr_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcr ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 rcr_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux rcr_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rcr eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 rol_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux rol_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rol al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 rol_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux rol_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rol ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 rol_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux rol_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"rol eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 ror_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux ror_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"ror al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 ror_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux ror_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"ror ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 ror_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux ror_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"ror eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 shl_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux shl_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shl al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 shl_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux shl_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shl ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 shl_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux shl_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shl eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 shr_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux shr_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shr al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 shr_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux shr_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shr ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 shr_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux shr_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shr eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u8 sar_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux sar_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sar al,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [cl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al cl];
|
||||||
|
|
||||||
|
u16 sar_word_asm(u32 *flags,u16 d, u8 s);
|
||||||
|
#pragma aux sar_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sar ax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax cl];
|
||||||
|
|
||||||
|
u32 sar_long_asm(u32 *flags,u32 d, u8 s);
|
||||||
|
#pragma aux sar_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sar eax,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax cl];
|
||||||
|
|
||||||
|
u16 shld_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
|
||||||
|
#pragma aux shld_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shld ax,dx,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [dx] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax dx cl];
|
||||||
|
|
||||||
|
u32 shld_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
|
||||||
|
#pragma aux shld_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shld eax,edx,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [edx] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax edx cl];
|
||||||
|
|
||||||
|
u16 shrd_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
|
||||||
|
#pragma aux shrd_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shrd ax,dx,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [dx] [cl] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax dx cl];
|
||||||
|
|
||||||
|
u32 shrd_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
|
||||||
|
#pragma aux shrd_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"shrd eax,edx,cl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [edx] [cl] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax edx cl];
|
||||||
|
|
||||||
|
u8 sbb_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux sbb_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sbb al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 sbb_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux sbb_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sbb ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 sbb_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux sbb_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sbb eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 sub_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux sub_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sub al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 sub_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux sub_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sub ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 sub_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux sub_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"sub eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
void test_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux test_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"test al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
void test_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux test_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"test ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
void test_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux test_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"test eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
u8 xor_byte_asm(u32 *flags,u8 d, u8 s);
|
||||||
|
#pragma aux xor_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"xor al,bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [al] [bl] \
|
||||||
|
value [al] \
|
||||||
|
modify exact [al bl];
|
||||||
|
|
||||||
|
u16 xor_word_asm(u32 *flags,u16 d, u16 s);
|
||||||
|
#pragma aux xor_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"xor ax,bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [ax] [bx] \
|
||||||
|
value [ax] \
|
||||||
|
modify exact [ax bx];
|
||||||
|
|
||||||
|
u32 xor_long_asm(u32 *flags,u32 d, u32 s);
|
||||||
|
#pragma aux xor_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"xor eax,ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
parm [edi] [eax] [ebx] \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax ebx];
|
||||||
|
|
||||||
|
void imul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
|
||||||
|
#pragma aux imul_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"imul bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
parm [edi] [esi] [al] [bl] \
|
||||||
|
modify exact [esi ax bl];
|
||||||
|
|
||||||
|
void imul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
|
||||||
|
#pragma aux imul_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"imul bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
"mov [ecx],dx" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [bx]\
|
||||||
|
modify exact [esi edi ax bx dx];
|
||||||
|
|
||||||
|
void imul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
|
||||||
|
#pragma aux imul_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"imul ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],eax" \
|
||||||
|
"mov [ecx],edx" \
|
||||||
|
parm [edi] [esi] [ecx] [eax] [ebx] \
|
||||||
|
modify exact [esi edi eax ebx edx];
|
||||||
|
|
||||||
|
void mul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
|
||||||
|
#pragma aux mul_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"mul bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
parm [edi] [esi] [al] [bl] \
|
||||||
|
modify exact [esi ax bl];
|
||||||
|
|
||||||
|
void mul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
|
||||||
|
#pragma aux mul_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"mul bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
"mov [ecx],dx" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [bx]\
|
||||||
|
modify exact [esi edi ax bx dx];
|
||||||
|
|
||||||
|
void mul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
|
||||||
|
#pragma aux mul_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"mul ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],eax" \
|
||||||
|
"mov [ecx],edx" \
|
||||||
|
parm [edi] [esi] [ecx] [eax] [ebx] \
|
||||||
|
modify exact [esi edi eax ebx edx];
|
||||||
|
|
||||||
|
void idiv_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
|
||||||
|
#pragma aux idiv_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"idiv bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],al" \
|
||||||
|
"mov [ecx],ah" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [bl]\
|
||||||
|
modify exact [esi edi ax bl];
|
||||||
|
|
||||||
|
void idiv_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
|
||||||
|
#pragma aux idiv_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"idiv bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
"mov [ecx],dx" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [dx] [bx]\
|
||||||
|
modify exact [esi edi ax dx bx];
|
||||||
|
|
||||||
|
void idiv_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
|
||||||
|
#pragma aux idiv_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"idiv ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],eax" \
|
||||||
|
"mov [ecx],edx" \
|
||||||
|
parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
|
||||||
|
modify exact [esi edi eax edx ebx];
|
||||||
|
|
||||||
|
void div_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
|
||||||
|
#pragma aux div_byte_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"div bl" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],al" \
|
||||||
|
"mov [ecx],ah" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [bl]\
|
||||||
|
modify exact [esi edi ax bl];
|
||||||
|
|
||||||
|
void div_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
|
||||||
|
#pragma aux div_word_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"div bx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],ax" \
|
||||||
|
"mov [ecx],dx" \
|
||||||
|
parm [edi] [esi] [ecx] [ax] [dx] [bx]\
|
||||||
|
modify exact [esi edi ax dx bx];
|
||||||
|
|
||||||
|
void div_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
|
||||||
|
#pragma aux div_long_asm = \
|
||||||
|
"push [edi]" \
|
||||||
|
"popf" \
|
||||||
|
"div ebx" \
|
||||||
|
"pushf" \
|
||||||
|
"pop [edi]" \
|
||||||
|
"mov [esi],eax" \
|
||||||
|
"mov [ecx],edx" \
|
||||||
|
parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
|
||||||
|
modify exact [esi edi eax edx ebx];
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_PRIM_ASM_H */
|
||||||
232
include/x86prim_ops.h
Normal file
232
include/x86prim_ops.h
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* 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 primitive operation functions.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __X86EMU_PRIM_OPS_H
|
||||||
|
#define __X86EMU_PRIM_OPS_H
|
||||||
|
|
||||||
|
#include "x86prim_asm.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint16_t aaa_word (uint16_t d);
|
||||||
|
uint16_t aas_word (uint16_t d);
|
||||||
|
uint16_t aad_word (uint16_t d);
|
||||||
|
uint16_t aam_word (uint8_t d);
|
||||||
|
uint8_t adc_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t adc_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t adc_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t add_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t add_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t add_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t and_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t and_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t and_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t cmp_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t cmp_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t cmp_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t daa_byte (uint8_t d);
|
||||||
|
uint8_t das_byte (uint8_t d);
|
||||||
|
uint8_t dec_byte (uint8_t d);
|
||||||
|
uint16_t dec_word (uint16_t d);
|
||||||
|
uint32_t dec_long (uint32_t d);
|
||||||
|
uint8_t inc_byte (uint8_t d);
|
||||||
|
uint16_t inc_word (uint16_t d);
|
||||||
|
uint32_t inc_long (uint32_t d);
|
||||||
|
uint8_t or_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t or_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t or_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t neg_byte (uint8_t s);
|
||||||
|
uint16_t neg_word (uint16_t s);
|
||||||
|
uint32_t neg_long (uint32_t s);
|
||||||
|
uint8_t not_byte (uint8_t s);
|
||||||
|
uint16_t not_word (uint16_t s);
|
||||||
|
uint32_t not_long (uint32_t s);
|
||||||
|
uint8_t rcl_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t rcl_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t rcl_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t rcr_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t rcr_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t rcr_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t rol_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t rol_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t rol_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t ror_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t ror_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t ror_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t shl_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t shl_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t shl_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t shr_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t shr_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t shr_long (uint32_t d, uint8_t s);
|
||||||
|
uint8_t sar_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t sar_word (uint16_t d, uint8_t s);
|
||||||
|
uint32_t sar_long (uint32_t d, uint8_t s);
|
||||||
|
uint16_t shld_word (uint16_t d, uint16_t fill, uint8_t s);
|
||||||
|
uint32_t shld_long (uint32_t d, uint32_t fill, uint8_t s);
|
||||||
|
uint16_t shrd_word (uint16_t d, uint16_t fill, uint8_t s);
|
||||||
|
uint32_t shrd_long (uint32_t d, uint32_t fill, uint8_t s);
|
||||||
|
uint8_t sbb_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t sbb_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t sbb_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t sub_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t sub_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t sub_long (uint32_t d, uint32_t s);
|
||||||
|
void test_byte (uint8_t d, uint8_t s);
|
||||||
|
void test_word (uint16_t d, uint16_t s);
|
||||||
|
void test_long (uint32_t d, uint32_t s);
|
||||||
|
uint8_t xor_byte (uint8_t d, uint8_t s);
|
||||||
|
uint16_t xor_word (uint16_t d, uint16_t s);
|
||||||
|
uint32_t xor_long (uint32_t d, uint32_t s);
|
||||||
|
void imul_byte (uint8_t s);
|
||||||
|
void imul_word (uint16_t s);
|
||||||
|
void imul_long (uint32_t s);
|
||||||
|
void imul_long_direct(uint32_t *res_lo, uint32_t* res_hi,uint32_t d, uint32_t s);
|
||||||
|
void mul_byte (uint8_t s);
|
||||||
|
void mul_word (uint16_t s);
|
||||||
|
void mul_long (uint32_t s);
|
||||||
|
void idiv_byte (uint8_t s);
|
||||||
|
void idiv_word (uint16_t s);
|
||||||
|
void idiv_long (uint32_t s);
|
||||||
|
void div_byte (uint8_t s);
|
||||||
|
void div_word (uint16_t s);
|
||||||
|
void div_long (uint32_t s);
|
||||||
|
void ins (int size);
|
||||||
|
void outs (int size);
|
||||||
|
uint16_t mem_access_word (int addr);
|
||||||
|
void push_word (uint16_t w);
|
||||||
|
void push_long (uint32_t w);
|
||||||
|
uint16_t pop_word (void);
|
||||||
|
uint32_t pop_long (void);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__HAVE_INLINE_ASSEMBLER__) && !defined(PRIM_OPS_NO_REDEFINE_ASM)
|
||||||
|
|
||||||
|
#define aaa_word(d) aaa_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define aas_word(d) aas_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define aad_word(d) aad_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define aam_word(d) aam_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define adc_byte(d,s) adc_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define adc_word(d,s) adc_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define adc_long(d,s) adc_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define add_byte(d,s) add_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define add_word(d,s) add_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define add_long(d,s) add_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define and_byte(d,s) and_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define and_word(d,s) and_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define and_long(d,s) and_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define cmp_byte(d,s) cmp_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define cmp_word(d,s) cmp_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define cmp_long(d,s) cmp_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define daa_byte(d) daa_byte_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define das_byte(d) das_byte_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define dec_byte(d) dec_byte_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define dec_word(d) dec_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define dec_long(d) dec_long_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define inc_byte(d) inc_byte_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define inc_word(d) inc_word_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define inc_long(d) inc_long_asm(&M.x86.R_EFLG,d)
|
||||||
|
#define or_byte(d,s) or_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define or_word(d,s) or_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define or_long(d,s) or_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define neg_byte(s) neg_byte_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define neg_word(s) neg_word_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define neg_long(s) neg_long_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define not_byte(s) not_byte_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define not_word(s) not_word_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define not_long(s) not_long_asm(&M.x86.R_EFLG,s)
|
||||||
|
#define rcl_byte(d,s) rcl_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rcl_word(d,s) rcl_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rcl_long(d,s) rcl_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rcr_byte(d,s) rcr_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rcr_word(d,s) rcr_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rcr_long(d,s) rcr_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rol_byte(d,s) rol_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rol_word(d,s) rol_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define rol_long(d,s) rol_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define ror_byte(d,s) ror_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define ror_word(d,s) ror_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define ror_long(d,s) ror_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shl_byte(d,s) shl_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shl_word(d,s) shl_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shl_long(d,s) shl_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shr_byte(d,s) shr_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shr_word(d,s) shr_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shr_long(d,s) shr_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sar_byte(d,s) sar_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sar_word(d,s) sar_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sar_long(d,s) sar_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define shld_word(d,fill,s) shld_word_asm(&M.x86.R_EFLG,d,fill,s)
|
||||||
|
#define shld_long(d,fill,s) shld_long_asm(&M.x86.R_EFLG,d,fill,s)
|
||||||
|
#define shrd_word(d,fill,s) shrd_word_asm(&M.x86.R_EFLG,d,fill,s)
|
||||||
|
#define shrd_long(d,fill,s) shrd_long_asm(&M.x86.R_EFLG,d,fill,s)
|
||||||
|
#define sbb_byte(d,s) sbb_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sbb_word(d,s) sbb_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sbb_long(d,s) sbb_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sub_byte(d,s) sub_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sub_word(d,s) sub_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define sub_long(d,s) sub_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define test_byte(d,s) test_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define test_word(d,s) test_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define test_long(d,s) test_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define xor_byte(d,s) xor_byte_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define xor_word(d,s) xor_word_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define xor_long(d,s) xor_long_asm(&M.x86.R_EFLG,d,s)
|
||||||
|
#define imul_byte(s) imul_byte_asm(&M.x86.R_EFLG,&M.x86.R_AX,M.x86.R_AL,s)
|
||||||
|
#define imul_word(s) imul_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,s)
|
||||||
|
#define imul_long(s) imul_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,s)
|
||||||
|
#define imul_long_direct(res_lo,res_hi,d,s) imul_long_asm(&M.x86.R_EFLG,res_lo,res_hi,d,s)
|
||||||
|
#define mul_byte(s) mul_byte_asm(&M.x86.R_EFLG,&M.x86.R_AX,M.x86.R_AL,s)
|
||||||
|
#define mul_word(s) mul_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,s)
|
||||||
|
#define mul_long(s) mul_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,s)
|
||||||
|
#define idiv_byte(s) idiv_byte_asm(&M.x86.R_EFLG,&M.x86.R_AL,&M.x86.R_AH,M.x86.R_AX,s)
|
||||||
|
#define idiv_word(s) idiv_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,M.x86.R_DX,s)
|
||||||
|
#define idiv_long(s) idiv_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,M.x86.R_EDX,s)
|
||||||
|
#define div_byte(s) div_byte_asm(&M.x86.R_EFLG,&M.x86.R_AL,&M.x86.R_AH,M.x86.R_AX,s)
|
||||||
|
#define div_word(s) div_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,M.x86.R_DX,s)
|
||||||
|
#define div_long(s) div_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,M.x86.R_EDX,s)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of "C" linkage for C++ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __X86EMU_PRIM_OPS_H */
|
||||||
@@ -59,8 +59,6 @@
|
|||||||
* done using the native instruction set fully.
|
* done using the native instruction set fully.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __BIG_ENDIAN__
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t e_reg;
|
uint32_t e_reg;
|
||||||
} I32_reg_t;
|
} I32_reg_t;
|
||||||
@@ -73,22 +71,6 @@ typedef struct {
|
|||||||
uint8_t filler0, filler1, h_reg, l_reg;
|
uint8_t filler0, filler1, h_reg, l_reg;
|
||||||
} I8_reg_t;
|
} I8_reg_t;
|
||||||
|
|
||||||
#else /* !__BIG_ENDIAN__ */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t e_reg;
|
|
||||||
} I32_reg_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t x_reg;
|
|
||||||
} I16_reg_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t l_reg, h_reg;
|
|
||||||
} I8_reg_t;
|
|
||||||
|
|
||||||
#endif /* BIG_ENDIAN */
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
I32_reg_t I32_reg;
|
I32_reg_t I32_reg;
|
||||||
I16_reg_t I16_reg;
|
I16_reg_t I16_reg;
|
||||||
@@ -275,7 +257,7 @@ typedef struct {
|
|||||||
uint32_t mode;
|
uint32_t mode;
|
||||||
volatile int intr; /* mask of pending interrupts */
|
volatile int intr; /* mask of pending interrupts */
|
||||||
int debug;
|
int debug;
|
||||||
#ifdef DEBUG
|
#ifdef DBG_X86EMU
|
||||||
int check;
|
int check;
|
||||||
uint16_t saved_ip;
|
uint16_t saved_ip;
|
||||||
uint16_t saved_cs;
|
uint16_t saved_cs;
|
||||||
|
|||||||
@@ -11,18 +11,10 @@
|
|||||||
* option any later version.
|
* option any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <mint/errno.h>
|
#include "bas_types.h"
|
||||||
#include <mint/sysvars.h>
|
#include "bas_string.h"
|
||||||
#include <string.h>
|
|
||||||
#include "fb.h"
|
#include "fb.h"
|
||||||
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE 0
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
/* MD - Memory Descriptor */
|
/* MD - Memory Descriptor */
|
||||||
@@ -94,7 +86,7 @@ static MD *ffit(long amount, MPB *mp)
|
|||||||
if((q = mp->mp_rover) == 0) /* get rotating pointer */
|
if((q = mp->mp_rover) == 0) /* get rotating pointer */
|
||||||
return(0) ;
|
return(0) ;
|
||||||
maxval = 0;
|
maxval = 0;
|
||||||
maxflg = ((amount == -1) ? TRUE : FALSE) ;
|
maxflg = ((amount == -1) ? true : false) ;
|
||||||
p = q->m_link; /* start with next MD */
|
p = q->m_link; /* start with next MD */
|
||||||
do /* search the list for an MD with enough space */
|
do /* search the list for an MD with enough space */
|
||||||
{
|
{
|
||||||
@@ -198,7 +190,7 @@ long offscreen_free(struct fb_info *info, long addr)
|
|||||||
Funcs_puts(buf);
|
Funcs_puts(buf);
|
||||||
Funcs_puts("\r\n");
|
Funcs_puts("\r\n");
|
||||||
#endif
|
#endif
|
||||||
*vblsem = 0;
|
//*vblsem = 0;
|
||||||
mpb = &pmd;
|
mpb = &pmd;
|
||||||
for (p = *(q = &mpb->mp_mal); p; p = *(q = &p->m_link))
|
for (p = *(q = &mpb->mp_mal); p; p = *(q = &p->m_link))
|
||||||
{
|
{
|
||||||
@@ -207,12 +199,12 @@ long offscreen_free(struct fb_info *info, long addr)
|
|||||||
}
|
}
|
||||||
if(!p)
|
if(!p)
|
||||||
{
|
{
|
||||||
*vblsem = 1;
|
// *vblsem = 1;
|
||||||
return(EFAULT);
|
return -1; //(EFAULT);
|
||||||
}
|
}
|
||||||
*q = p->m_link;
|
*q = p->m_link;
|
||||||
freeit(p,mpb);
|
freeit(p,mpb);
|
||||||
*vblsem = 1;
|
//*vblsem = 1;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,16 +219,16 @@ long offscreen_alloc(struct fb_info *info, long amount)
|
|||||||
Funcs_puts(buf);
|
Funcs_puts(buf);
|
||||||
Funcs_puts(") = 0x");
|
Funcs_puts(") = 0x");
|
||||||
#endif
|
#endif
|
||||||
*vblsem = 0;
|
// *vblsem = 0;
|
||||||
if(amount == -1L)
|
if(amount == -1L)
|
||||||
{
|
{
|
||||||
ret = (long)ffit(-1L,&pmd);
|
ret = (long)ffit(-1L,&pmd);
|
||||||
*vblsem = 1;
|
// *vblsem = 1;
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
if(amount <= 0 )
|
if(amount <= 0 )
|
||||||
{
|
{
|
||||||
*vblsem = 1;
|
// *vblsem = 1;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
if((amount & 1))
|
if((amount & 1))
|
||||||
@@ -247,7 +239,7 @@ long offscreen_alloc(struct fb_info *info, long amount)
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Funcs_puts("0\r\n");
|
Funcs_puts("0\r\n");
|
||||||
#endif
|
#endif
|
||||||
*vblsem = 1;
|
// *vblsem = 1;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -256,13 +248,13 @@ long offscreen_alloc(struct fb_info *info, long amount)
|
|||||||
Funcs_puts("\r\n");
|
Funcs_puts("\r\n");
|
||||||
#endif
|
#endif
|
||||||
ret = (long)m->m_start;
|
ret = (long)m->m_start;
|
||||||
*vblsem = 1;
|
// *vblsem = 1;
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
long offscren_reserved(struct fb_info *info)
|
long offscren_reserved(struct fb_info *info)
|
||||||
{
|
{
|
||||||
return((long)info_fvdi->ram_base + (long) info->ram_size);
|
return((long) info->ram_base + (long) info->ram_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void offscreen_init(struct fb_info *info)
|
void offscreen_init(struct fb_info *info)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#define RINFO_ONLY
|
#define RINFO_ONLY
|
||||||
|
#include "x86debug.h"
|
||||||
#include "radeonfb.h"
|
#include "radeonfb.h"
|
||||||
#include "bas_printf.h"
|
#include "bas_printf.h"
|
||||||
#include "bas_string.h"
|
#include "bas_string.h"
|
||||||
@@ -7,14 +8,6 @@
|
|||||||
#include "x86emu.h"
|
#include "x86emu.h"
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "pci_ids.h"
|
#include "pci_ids.h"
|
||||||
// #include "vgatables.h"
|
|
||||||
|
|
||||||
#define DBG_EMULATOR
|
|
||||||
#ifdef DBG_EMULATOR
|
|
||||||
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
|
|
||||||
#else
|
|
||||||
#define dbg(format, arg...) do { ; } while (0)
|
|
||||||
#endif /* DBG_EMULATOR */
|
|
||||||
|
|
||||||
#define USE_SDRAM
|
#define USE_SDRAM
|
||||||
#define DIRECT_ACCESS
|
#define DIRECT_ACCESS
|
||||||
@@ -79,6 +72,8 @@ extern int pcibios_handler();
|
|||||||
extern COOKIE *get_cookie(long id);
|
extern COOKIE *get_cookie(long id);
|
||||||
extern short restart, os_magic;
|
extern short restart, os_magic;
|
||||||
|
|
||||||
|
X86EMU_sysEnv _X86EMU_env;
|
||||||
|
|
||||||
/* general software interrupt handler */
|
/* general software interrupt handler */
|
||||||
uint32_t getIntVect(int num)
|
uint32_t getIntVect(int num)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user