1 | /****************************************************************************
|
---|
2 | *
|
---|
3 | * Realmode X86 Emulator Library
|
---|
4 | *
|
---|
5 | * Copyright (C) 1996-1999 SciTech Software, Inc.
|
---|
6 | * Copyright (C) David Mosberger-Tang
|
---|
7 | * Copyright (C) 1999 Egbert Eich
|
---|
8 | *
|
---|
9 | * ========================================================================
|
---|
10 | *
|
---|
11 | * Permission to use, copy, modify, distribute, and sell this software and
|
---|
12 | * its documentation for any purpose is hereby granted without fee,
|
---|
13 | * provided that the above copyright notice appear in all copies and that
|
---|
14 | * both that copyright notice and this permission notice appear in
|
---|
15 | * supporting documentation, and that the name of the authors not be used
|
---|
16 | * in advertising or publicity pertaining to distribution of the software
|
---|
17 | * without specific, written prior permission. The authors makes no
|
---|
18 | * representations about the suitability of this software for any purpose.
|
---|
19 | * It is provided "as is" without express or implied warranty.
|
---|
20 | *
|
---|
21 | * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
---|
22 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
---|
23 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
---|
24 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
---|
25 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
---|
26 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
---|
27 | * PERFORMANCE OF THIS SOFTWARE.
|
---|
28 | *
|
---|
29 | * ========================================================================
|
---|
30 | *
|
---|
31 | * Language: ANSI C
|
---|
32 | * Environment: Any
|
---|
33 | * Developer: Kendall Bennett
|
---|
34 | *
|
---|
35 | * Description: Header file for public specific functions.
|
---|
36 | * Any application linking against us should only
|
---|
37 | * include this header
|
---|
38 | *
|
---|
39 | ****************************************************************************/
|
---|
40 |
|
---|
41 | #ifndef __X86EMU_X86EMU_H
|
---|
42 | #define __X86EMU_X86EMU_H
|
---|
43 |
|
---|
44 | #ifdef SCITECH
|
---|
45 | #include "scitech.h"
|
---|
46 | #define X86API _ASMAPI
|
---|
47 | #define X86APIP _ASMAPIP
|
---|
48 | typedef int X86EMU_pioAddr;
|
---|
49 | #else
|
---|
50 | #include "x86emu/types.h"
|
---|
51 | #define X86API
|
---|
52 | #define X86APIP *
|
---|
53 | #endif
|
---|
54 | #include "x86emu/regs.h"
|
---|
55 |
|
---|
56 | /*---------------------- Macros and type definitions ----------------------*/
|
---|
57 |
|
---|
58 | #ifdef PACK
|
---|
59 | # pragma PACK /* Don't pack structs with function pointers! */
|
---|
60 | #endif
|
---|
61 |
|
---|
62 | /****************************************************************************
|
---|
63 | REMARKS:
|
---|
64 | Data structure containing ponters to programmed I/O functions used by the
|
---|
65 | emulator. This is used so that the user program can hook all programmed
|
---|
66 | I/O for the emulator to handled as necessary by the user program. By
|
---|
67 | default the emulator contains simple functions that do not do access the
|
---|
68 | hardware in any way. To allow the emualtor access the hardware, you will
|
---|
69 | need to override the programmed I/O functions using the X86EMU_setupPioFuncs
|
---|
70 | function.
|
---|
71 |
|
---|
72 | HEADER:
|
---|
73 | x86emu.h
|
---|
74 |
|
---|
75 | MEMBERS:
|
---|
76 | inb - Function to read a byte from an I/O port
|
---|
77 | inw - Function to read a word from an I/O port
|
---|
78 | inl - Function to read a dword from an I/O port
|
---|
79 | outb - Function to write a byte to an I/O port
|
---|
80 | outw - Function to write a word to an I/O port
|
---|
81 | outl - Function to write a dword to an I/O port
|
---|
82 | ****************************************************************************/
|
---|
83 | typedef struct {
|
---|
84 | u8 (X86APIP inb)(X86EMU_pioAddr addr);
|
---|
85 | u16 (X86APIP inw)(X86EMU_pioAddr addr);
|
---|
86 | u32 (X86APIP inl)(X86EMU_pioAddr addr);
|
---|
87 | void (X86APIP outb)(X86EMU_pioAddr addr, u8 val);
|
---|
88 | void (X86APIP outw)(X86EMU_pioAddr addr, u16 val);
|
---|
89 | void (X86APIP outl)(X86EMU_pioAddr addr, u32 val);
|
---|
90 | } X86EMU_pioFuncs;
|
---|
91 |
|
---|
92 | /****************************************************************************
|
---|
93 | REMARKS:
|
---|
94 | Data structure containing ponters to memory access functions used by the
|
---|
95 | emulator. This is used so that the user program can hook all memory
|
---|
96 | access functions as necessary for the emulator. By default the emulator
|
---|
97 | contains simple functions that only access the internal memory of the
|
---|
98 | emulator. If you need specialised functions to handle access to different
|
---|
99 | types of memory (ie: hardware framebuffer accesses and BIOS memory access
|
---|
100 | etc), you will need to override this using the X86EMU_setupMemFuncs
|
---|
101 | function.
|
---|
102 |
|
---|
103 | HEADER:
|
---|
104 | x86emu.h
|
---|
105 |
|
---|
106 | MEMBERS:
|
---|
107 | rdb - Function to read a byte from an address
|
---|
108 | rdw - Function to read a word from an address
|
---|
109 | rdl - Function to read a dword from an address
|
---|
110 | wrb - Function to write a byte to an address
|
---|
111 | wrw - Function to write a word to an address
|
---|
112 | wrl - Function to write a dword to an address
|
---|
113 | ****************************************************************************/
|
---|
114 | typedef struct {
|
---|
115 | u8 (X86APIP rdb)(u32 addr);
|
---|
116 | u16 (X86APIP rdw)(u32 addr);
|
---|
117 | u32 (X86APIP rdl)(u32 addr);
|
---|
118 | void (X86APIP wrb)(u32 addr, u8 val);
|
---|
119 | void (X86APIP wrw)(u32 addr, u16 val);
|
---|
120 | void (X86APIP wrl)(u32 addr, u32 val);
|
---|
121 | } X86EMU_memFuncs;
|
---|
122 |
|
---|
123 | /****************************************************************************
|
---|
124 | Here are the default memory read and write
|
---|
125 | function in case they are needed as fallbacks.
|
---|
126 | ***************************************************************************/
|
---|
127 | extern u8 X86API rdb(u32 addr);
|
---|
128 | extern u16 X86API rdw(u32 addr);
|
---|
129 | extern u32 X86API rdl(u32 addr);
|
---|
130 | extern void X86API wrb(u32 addr, u8 val);
|
---|
131 | extern void X86API wrw(u32 addr, u16 val);
|
---|
132 | extern void X86API wrl(u32 addr, u32 val);
|
---|
133 |
|
---|
134 | #ifdef END_PACK
|
---|
135 | # pragma END_PACK
|
---|
136 | #endif
|
---|
137 |
|
---|
138 | /*--------------------- type definitions -----------------------------------*/
|
---|
139 |
|
---|
140 | typedef void (X86APIP X86EMU_intrFuncs)(int num);
|
---|
141 | extern X86EMU_intrFuncs _X86EMU_intrTab[256];
|
---|
142 |
|
---|
143 | /*-------------------------- Function Prototypes --------------------------*/
|
---|
144 |
|
---|
145 | #ifdef __cplusplus
|
---|
146 | extern "C" { /* Use "C" linkage when in C++ mode */
|
---|
147 | #endif
|
---|
148 |
|
---|
149 | void X86EMU_setupMemFuncs(X86EMU_memFuncs *funcs);
|
---|
150 | void X86EMU_setupPioFuncs(X86EMU_pioFuncs *funcs);
|
---|
151 | void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
|
---|
152 | void X86EMU_prepareForInt(int num);
|
---|
153 |
|
---|
154 | /* decode.c */
|
---|
155 |
|
---|
156 | void X86EMU_exec(void);
|
---|
157 | void X86EMU_halt_sys(void);
|
---|
158 |
|
---|
159 | #ifdef DEBUG
|
---|
160 | #define HALT_SYS() \
|
---|
161 | printk("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
|
---|
162 | X86EMU_halt_sys()
|
---|
163 | #else
|
---|
164 | #define HALT_SYS() X86EMU_halt_sys()
|
---|
165 | #endif
|
---|
166 |
|
---|
167 | /* Debug options */
|
---|
168 |
|
---|
169 | #define DEBUG_DECODE_F 0x000001 /* print decoded instruction */
|
---|
170 | #define DEBUG_TRACE_F 0x000002 /* dump regs before/after execution */
|
---|
171 | #define DEBUG_STEP_F 0x000004
|
---|
172 | #define DEBUG_DISASSEMBLE_F 0x000008
|
---|
173 | #define DEBUG_BREAK_F 0x000010
|
---|
174 | #define DEBUG_SVC_F 0x000020
|
---|
175 | #define DEBUG_SAVE_IP_CS_F 0x000040
|
---|
176 | #define DEBUG_FS_F 0x000080
|
---|
177 | #define DEBUG_PROC_F 0x000100
|
---|
178 | #define DEBUG_SYSINT_F 0x000200 /* bios system interrupts. */
|
---|
179 | #define DEBUG_TRACECALL_F 0x000400
|
---|
180 | #define DEBUG_INSTRUMENT_F 0x000800
|
---|
181 | #define DEBUG_MEM_TRACE_F 0x001000
|
---|
182 | #define DEBUG_IO_TRACE_F 0x002000
|
---|
183 | #define DEBUG_TRACECALL_REGS_F 0x004000
|
---|
184 | #define DEBUG_DECODE_NOPRINT_F 0x008000
|
---|
185 | #define DEBUG_EXIT 0x010000
|
---|
186 | #define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
|
---|
187 |
|
---|
188 | void X86EMU_trace_regs(void);
|
---|
189 | void X86EMU_trace_xregs(void);
|
---|
190 | void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
|
---|
191 | int X86EMU_trace_on(void);
|
---|
192 | int X86EMU_trace_off(void);
|
---|
193 |
|
---|
194 | #ifdef __cplusplus
|
---|
195 | } /* End of "C" linkage for C++ */
|
---|
196 | #endif
|
---|
197 |
|
---|
198 | #endif /* __X86EMU_X86EMU_H */
|
---|