blob: 77d245ad7e539b63ad37a26412b0a885b4000d71 (
plain) (
tree)
|
|
/*[
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
|