summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/base/ccpu386/c_main.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/softpc.new/base/ccpu386/c_main.h')
-rw-r--r--private/mvdm/softpc.new/base/ccpu386/c_main.h226
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
+