| 1 | /* $NetBSD: x86emu_regs.h,v 1.1 2007/12/01 20:14:10 joerg Exp $ */ |
| 2 | |
| 3 | /**************************************************************************** |
| 4 | * |
| 5 | * Realmode X86 Emulator Library |
| 6 | * |
| 7 | * Copyright (C) 1996-1999 SciTech Software, Inc. |
| 8 | * Copyright (C) David Mosberger-Tang |
| 9 | * Copyright (C) 1999 Egbert Eich |
| 10 | * Copyright (C) 2007 Joerg Sonnenberger |
| 11 | * |
| 12 | * ======================================================================== |
| 13 | * |
| 14 | * Permission to use, copy, modify, distribute, and sell this software and |
| 15 | * its documentation for any purpose is hereby granted without fee, |
| 16 | * provided that the above copyright notice appear in all copies and that |
| 17 | * both that copyright notice and this permission notice appear in |
| 18 | * supporting documentation, and that the name of the authors not be used |
| 19 | * in advertising or publicity pertaining to distribution of the software |
| 20 | * without specific, written prior permission. The authors makes no |
| 21 | * representations about the suitability of this software for any purpose. |
| 22 | * It is provided "as is" without express or implied warranty. |
| 23 | * |
| 24 | * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| 25 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| 26 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| 27 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF |
| 28 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR |
| 29 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| 30 | * PERFORMANCE OF THIS SOFTWARE. |
| 31 | * |
| 32 | ****************************************************************************/ |
| 33 | |
| 34 | #ifndef __X86EMU_REGS_H |
| 35 | #define __X86EMU_REGS_H |
| 36 | |
| 37 | /*---------------------- Macros and type definitions ----------------------*/ |
| 38 | |
| 39 | /* 8 bit registers */ |
| 40 | #define R_AH register_a.I8_reg.h_reg |
| 41 | #define R_AL register_a.I8_reg.l_reg |
| 42 | #define R_BH register_b.I8_reg.h_reg |
| 43 | #define R_BL register_b.I8_reg.l_reg |
| 44 | #define R_CH register_c.I8_reg.h_reg |
| 45 | #define R_CL register_c.I8_reg.l_reg |
| 46 | #define R_DH register_d.I8_reg.h_reg |
| 47 | #define R_DL register_d.I8_reg.l_reg |
| 48 | |
| 49 | /* 16 bit registers */ |
| 50 | #define R_AX register_a.I16_reg.x_reg |
| 51 | #define R_BX register_b.I16_reg.x_reg |
| 52 | #define R_CX register_c.I16_reg.x_reg |
| 53 | #define R_DX register_d.I16_reg.x_reg |
| 54 | |
| 55 | /* 32 bit extended registers */ |
| 56 | #define R_EAX register_a.I32_reg.e_reg |
| 57 | #define R_EBX register_b.I32_reg.e_reg |
| 58 | #define R_ECX register_c.I32_reg.e_reg |
| 59 | #define R_EDX register_d.I32_reg.e_reg |
| 60 | |
| 61 | /* special registers */ |
| 62 | #define R_SP register_sp.I16_reg.x_reg |
| 63 | #define R_BP register_bp.I16_reg.x_reg |
| 64 | #define R_SI register_si.I16_reg.x_reg |
| 65 | #define R_DI register_di.I16_reg.x_reg |
| 66 | #define R_IP register_ip.I16_reg.x_reg |
| 67 | #define R_FLG register_flags |
| 68 | |
| 69 | /* special registers */ |
| 70 | #define R_ESP register_sp.I32_reg.e_reg |
| 71 | #define R_EBP register_bp.I32_reg.e_reg |
| 72 | #define R_ESI register_si.I32_reg.e_reg |
| 73 | #define R_EDI register_di.I32_reg.e_reg |
| 74 | #define R_EIP register_ip.I32_reg.e_reg |
| 75 | #define R_EFLG register_flags |
| 76 | |
| 77 | /* segment registers */ |
| 78 | #define R_CS register_cs |
| 79 | #define R_DS register_ds |
| 80 | #define R_SS register_ss |
| 81 | #define R_ES register_es |
| 82 | #define R_FS register_fs |
| 83 | #define R_GS register_gs |
| 84 | |
| 85 | /* flag conditions */ |
| 86 | #define FB_CF 0x0001 /* CARRY flag */ |
| 87 | #define FB_PF 0x0004 /* PARITY flag */ |
| 88 | #define FB_AF 0x0010 /* AUX flag */ |
| 89 | #define FB_ZF 0x0040 /* ZERO flag */ |
| 90 | #define FB_SF 0x0080 /* SIGN flag */ |
| 91 | #define FB_TF 0x0100 /* TRAP flag */ |
| 92 | #define FB_IF 0x0200 /* INTERRUPT ENABLE flag */ |
| 93 | #define FB_DF 0x0400 /* DIR flag */ |
| 94 | #define FB_OF 0x0800 /* OVERFLOW flag */ |
| 95 | |
| 96 | /* 80286 and above always have bit#1 set */ |
| 97 | #define F_ALWAYS_ON (0x0002) /* flag bits always on */ |
| 98 | |
| 99 | /* |
| 100 | * Define a mask for only those flag bits we will ever pass back |
| 101 | * (via PUSHF) |
| 102 | */ |
| 103 | #define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF) |
| 104 | |
| 105 | /* following bits masked in to a 16bit quantity */ |
| 106 | |
| 107 | #define F_CF 0x0001 /* CARRY flag */ |
| 108 | #define F_PF 0x0004 /* PARITY flag */ |
| 109 | #define F_AF 0x0010 /* AUX flag */ |
| 110 | #define F_ZF 0x0040 /* ZERO flag */ |
| 111 | #define F_SF 0x0080 /* SIGN flag */ |
| 112 | #define F_TF 0x0100 /* TRAP flag */ |
| 113 | #define F_IF 0x0200 /* INTERRUPT ENABLE flag */ |
| 114 | #define F_DF 0x0400 /* DIR flag */ |
| 115 | #define F_OF 0x0800 /* OVERFLOW flag */ |
| 116 | |
| 117 | #define SET_FLAG(flag) (emu->x86.R_FLG |= (flag)) |
| 118 | #define CLEAR_FLAG(flag) (emu->x86.R_FLG &= ~(flag)) |
| 119 | #define ACCESS_FLAG(flag) (emu->x86.R_FLG & (flag)) |
| 120 | #define CLEARALL_FLAG(m) (emu->x86.R_FLG = 0) |
| 121 | |
| 122 | #define CONDITIONAL_SET_FLAG(COND,FLAG) \ |
| 123 | if (COND) SET_FLAG(FLAG); else CLEAR_FLAG(FLAG) |
| 124 | |
| 125 | #define F_PF_CALC 0x010000 /* PARITY flag has been calced */ |
| 126 | #define F_ZF_CALC 0x020000 /* ZERO flag has been calced */ |
| 127 | #define F_SF_CALC 0x040000 /* SIGN flag has been calced */ |
| 128 | |
| 129 | #define F_ALL_CALC 0xff0000 /* All have been calced */ |
| 130 | |
| 131 | /* |
| 132 | * Emulator machine state. |
| 133 | * Segment usage control. |
| 134 | */ |
| 135 | #define SYSMODE_SEG_DS_SS 0x00000001 |
| 136 | #define SYSMODE_SEGOVR_CS 0x00000002 |
| 137 | #define SYSMODE_SEGOVR_DS 0x00000004 |
| 138 | #define SYSMODE_SEGOVR_ES 0x00000008 |
| 139 | #define SYSMODE_SEGOVR_FS 0x00000010 |
| 140 | #define SYSMODE_SEGOVR_GS 0x00000020 |
| 141 | #define SYSMODE_SEGOVR_SS 0x00000040 |
| 142 | #define SYSMODE_PREFIX_REPE 0x00000080 |
| 143 | #define SYSMODE_PREFIX_REPNE 0x00000100 |
| 144 | #define SYSMODE_PREFIX_DATA 0x00000200 |
| 145 | #define SYSMODE_PREFIX_ADDR 0x00000400 |
| 146 | #define SYSMODE_INTR_PENDING 0x10000000 |
| 147 | #define SYSMODE_EXTRN_INTR 0x20000000 |
| 148 | #define SYSMODE_HALTED 0x40000000 |
| 149 | |
| 150 | #define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS | \ |
| 151 | SYSMODE_SEGOVR_CS | \ |
| 152 | SYSMODE_SEGOVR_DS | \ |
| 153 | SYSMODE_SEGOVR_ES | \ |
| 154 | SYSMODE_SEGOVR_FS | \ |
| 155 | SYSMODE_SEGOVR_GS | \ |
| 156 | SYSMODE_SEGOVR_SS) |
| 157 | #define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS | \ |
| 158 | SYSMODE_SEGOVR_CS | \ |
| 159 | SYSMODE_SEGOVR_DS | \ |
| 160 | SYSMODE_SEGOVR_ES | \ |
| 161 | SYSMODE_SEGOVR_FS | \ |
| 162 | SYSMODE_SEGOVR_GS | \ |
| 163 | SYSMODE_SEGOVR_SS | \ |
| 164 | SYSMODE_PREFIX_DATA | \ |
| 165 | SYSMODE_PREFIX_ADDR) |
| 166 | |
| 167 | #define INTR_SYNCH 0x1 |
| 168 | |
| 169 | #endif /* __X86EMU_REGS_H */ |
| 170 | |