diff options
Diffstat (limited to 'private/mvdm/softpc.new/base/ccpu386/c_main.h')
-rw-r--r-- | private/mvdm/softpc.new/base/ccpu386/c_main.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/base/ccpu386/c_main.h b/private/mvdm/softpc.new/base/ccpu386/c_main.h new file mode 100644 index 000000000..77d245ad7 --- /dev/null +++ b/private/mvdm/softpc.new/base/ccpu386/c_main.h @@ -0,0 +1,226 @@ +/*[ + +c_main.h + +LOCAL CHAR SccsID[]="@(#)c_main.h 1.11 09/02/94"; + +C CPU definitions and interfaces. +--------------------------------- + +]*/ + + +/* + Define major CPU varients here. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +/* Indicator that multiple shifts or rotates (ie count n != 1) should + treat the Overflow Flag as undefined. */ +#define SHIFTROT_N_OF_UNDEFINED + +/* Indicator to set MUL undefined flags to a specific value (else they + are left unchanged). */ +#define SET_UNDEFINED_MUL_FLAG + +/* Indicator to set DIV undefined flags to a specific value (else they + are left unchanged). */ +#define SET_UNDEFINED_DIV_FLAG + +/* Indicator to set SHRD/SHLD undefined flags (i.e. OF with shift > 1) + to a specific value (else they are left unchanged). */ +#define SET_UNDEFINED_SHxD_FLAG + +/* Indicator to set all other undefined flags to a specific value (else they + are left unchanged). */ +#define SET_UNDEFINED_FLAG + +/* Value to set undefined flags to (if they are not left unchanged). */ +#define UNDEFINED_FLAG 0 + + +/* + Rational definition of TRUE/FALSE. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leads to more efficient tests than other definitions. +typedef int BOOL; +#define FALSE ((BOOL)0) +#define TRUE ((BOOL)1) + */ + + +/* + Allowable types of segment prefixs. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Actually we define here only a type for no segment prefix, + otherwise the segment register names (CS_REG,DS_REG,...) are used. + */ +#define SEG_CLR 6 + + +/* + Frequently used constants. + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +/* Masks for bits 0 - 32. */ +#define BIT0_MASK 0x1 +#define BIT1_MASK 0x2 +#define BIT2_MASK 0x4 +#define BIT3_MASK 0x8 +#define BIT4_MASK 0x10 +#define BIT5_MASK 0x20 +#define BIT6_MASK 0x40 +#define BIT7_MASK 0x80 +#define BIT8_MASK 0x100 +#define BIT9_MASK 0x200 +#define BIT10_MASK 0x400 +#define BIT11_MASK 0x800 +#define BIT12_MASK 0x1000 +#define BIT13_MASK 0x2000 +#define BIT14_MASK 0x4000 +#define BIT15_MASK 0x8000 +#define BIT16_MASK 0x10000 +#define BIT17_MASK 0x20000 +#define BIT18_MASK 0x40000 +#define BIT19_MASK 0x80000 +#define BIT20_MASK 0x100000 +#define BIT21_MASK 0x200000 +#define BIT22_MASK 0x400000 +#define BIT23_MASK 0x800000 +#define BIT24_MASK 0x1000000 +#define BIT25_MASK 0x2000000 +#define BIT26_MASK 0x4000000 +#define BIT27_MASK 0x8000000 +#define BIT28_MASK 0x10000000 +#define BIT29_MASK 0x20000000 +#define BIT30_MASK 0x40000000 +#define BIT31_MASK 0x80000000 + +/* Various Intel component masks */ +#define BYTE_MASK 0xff +#define WORD_MASK 0xffff + +/* Widths for IO permission map checks */ +#define BYTE_WIDTH ((IUM8)1) +#define WORD_WIDTH ((IUM8)2) +#define DWORD_WIDTH ((IUM8)4) + +/* + Data structures. + ~~~~~~~~~~~~~~~~ + */ + +/* Our model for the data extracted from a decriptor entry. */ +typedef struct + { + IU32 base; /* 32-bit base address */ + IU32 limit; /* 32-bit offset limit */ + IU16 AR; /* 16-bit attributes/access rights */ + } CPU_DESCR; + + +/* + Table for converting byte quantity to Parity Flag. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +IMPORT IU8 pf_table[]; + +#ifdef PIG +IMPORT IBOOL took_relative_jump; +#endif /* PIG */ + + +/* + External interface provided to outside world. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +typedef IU16 IO_ADDR; + +#ifndef DOUBLE_CPU +/* + Note we can't include "cpu.h" as this would overwrite our macro + names, hence we must redefine the external subroutines here. + */ +IMPORT IU32 effective_addr IPT2( + IU16, selector, + IU32, offset + ); + +IMPORT VOID c_cpu_enable_a20 IPT0(); + +IMPORT VOID c_cpu_force_a20_low IPT0(); + +IMPORT VOID c_cpu_init IPT0(); + +IMPORT VOID c_cpu_reset IPT0(); + +IMPORT VOID c_cpu_continue IPT0(); + +IMPORT VOID c_cpu_simulate IPT0(); + +IMPORT VOID c_pig_interrupt IPT1(IU8, vector); + +IMPORT VOID c_cpu_unsimulate IPT0(); + + +#if 0 /* ROG */ +IMPORT VOID read_descriptor IPT2( + IU32, addr, + CPU_DESCR *, descr + ); + +IMPORT ISM32 selector_outside_table IPT2( + IU16, selector, + IU32 *, descr_addr + ); + +#endif /* 0 ROG */ + +#endif /* !DOUBLE_CPU */ + +/* + Useful mini functions (macros). + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +/* + Macros for access to MODRM bit fields. + + 7 6 5 4 3 2 1 0 + ================= + MODRM | | | | + ================= + MODE REG R_M + XXX LOW3 + SEG + EEE + SEG3 + SEG2 + + */ +#define GET_MODE(x) ((x) >> 6 & 0x3) +#define GET_R_M(x) ((x) & 0x7) +#define GET_REG(x) ((x) >> 3 & 0x7) +#define GET_XXX(x) ((x) >> 3 & 0x7) +#define GET_SEG(x) ((x) >> 3 & 0x7) +#define GET_EEE(x) ((x) >> 3 & 0x7) +#define GET_SEG3(x) ((x) >> 3 & 0x7) +#define GET_SEG2(x) ((x) >> 3 & 0x7) +#define GET_LOW3(x) ((x) & 0x7) + +/* Turn operand size into mask for Most Significant Bit. */ +#define SZ2MSB(x) ((IU32)0x80000000 >> 32 - x ) + +/* Turn operand size into mask for Operand. */ +#define SZ2MASK(x) ((IU32)0xffffffff >> 32 - x ) + +#ifdef DOUBLE_CPU + +#define HARD_CPU 0 +#define SOFT_CPU 1 + +IMPORT VOID double_switch_to IPT1(IU8, cpu_type); + +#endif + |