Metropoli BBS
VIEWER: v8086.h MODE: TEXT (ASCII)
/***	V8086.H
 *
 *	8086 Emulation Export Include File
 *
 *	Description:
 *
 *	Contains the exported structures, defines and VDH
 *	function prototypes for 8086 emulation.
 *
 */


/*INT32*/

/***ET+ Low memory defines - used by VBIOS */

#define IVT_START		0	/* Interrupt vector table start */
#define IVT_LEN 		0x400	/*     "        "     "   length */
/*end*/

/***ET+ flVdmStatus flags */

#define VDM_STATUS_VPM_32	0x00000001	/* 32 bit DPMI app */
#define VDM_STATUS_VPM_32_BIT	0
#define VDM_STATUS_VPM_APP	0x00000002	/* DPMI app started */
#define VDM_STATUS_VPM_APP_BIT	1
#define VDM_STATUS_VPM_EXEC	0x00000004	/* in VDM protected mode */
#define VDM_STATUS_VPM_EXEC_BIT 2
#define VDM_STATUS_VPM_TRAPMODE 0x00000008	/* V86 mode at kernel entry? */
#define VDM_STATUS_VPM_TRAP_BIT 3
#define VDM_STATUS_VPM_IF_FLAG	0x00000010	/* Virtual IF flag */
#define VDM_STATUS_VPM_IF_BIT	4
#define VDM_STATUS_VPM_08_HOOK	0x00000020	/* protect 08h hooked? */
#define VDM_STATUS_VPM_08_BIT	5
#define VDM_STATUS_VPM_1C_HOOK	0x00000040	/* protect 1Ch hooked? */
#define VDM_STATUS_VPM_1C_BIT	6
#define VDM_STATUS_VPM_PERM	0x00000080	/* protected mode allowed? */
#define VDM_STATUS_VPM_PERM_BIT 7
#define VDM_STATUS_VPM_XDOS	0x00000100	/* DOS API Extension active? */
#define VDM_STATUS_VPM_XDOS_BIT 8
#define VDM_STATUS_VPM_TERM	0x00000200	/* VDM terminating? */
#define VDM_STATUS_VPM_TERM_BIT 9
/*end*/

/***ET+ VDHInstallIntHook options */

#define VDH_ASM_HOOK		0x00000001L
/*end*/

/***ET+ VDHInstallIOHook options */

#define VDHIIH_ASM_HOOK 	VDH_ASM_HOOK
#define VDHIIH_ALWAYS_TRAP	0x00000002L
#define VDHIIH_NO_SIMULATE	0x00000004L
#define VDHIIH_IGNORE		0x00000010L
/*end*/

/***ET+ VDHSetIOHookState options */

#define SETIO_TRAP		TRUE
#define SETIO_NOTRAP		FALSE
/*end*/

/***ET+ I/O type flags - VDHInstallIOPort pfnOther handler */

#define IO_TYPE_SHIFT		8
#define IO_TYPE_MASK		0x00000F00L
#define IO_TYPE_INPUT		0x00000100L
#define IO_TYPE_OUTPUT		0x00000000L
#define IO_TYPE_STRING		0x00000200L
#define IO_TYPE_BYTE		0x00000400L
#define IO_TYPE_WORD		0x00000000L
#define IO_TYPE_DWORD		0x00000800L

#define IO_TYPE_ADDR32		0x00001000L
#define IO_TYPE_REP		0x00002000L
#define IO_TYPE_REVERSE 	0x00008000L

#define IO_SEG_SHIFT		16
#define IO_SEG_MASK		0x000f0000L
#define IO_SEG_ES		0x00000000L
#define IO_SEG_CS		0x00010000L
#define IO_SEG_SS		0x00020000L
#define IO_SEG_DS		0x00030000L
#define IO_SEG_FS		0x00040000L
#define IO_SEG_GS		0x00050000L
/*end*/

/***ET+ VDHCheckPagePerm and private DPMI options */

#define VPMPG_W 	   0x00000002	   /* Writable */
#define VPMPG_U 	   0x00000004	   /* user mode accessible */
#define VPMPG_X 	   0x00000008	   /* eXecutable */
#define VPMPG_R 	   0x00000010	   /* Readable */
/*end*/


/***ET+ VDHAllocHook options */

#define VDH_CONTEXT_HOOK		0
#define VDH_STI_HOOK			1
#define VDH_RETURN_HOOK 		2
#define VDH_TIMER_HOOK			3
#define VDH_BP_HOOK			4
/*end*/

/***ET+ VDHArmContextHook options */

#define GLOBAL_CONTEXT_HOOK	((HVDM) -1)
/*end*/

/***ET+ VDHArmReturnHook options */

#define VDHARH_NORMAL_RET		0
#define VDHARH_NORMAL_IRET		1
#define VDHARH_RECURSIVE_RET		2
#define VDHARH_RECURSIVE_IRET		3
#define VDHARH_CSEIP_HOOK		4
#define VDHARH_RECURSIVE_CSEIP_HOOK	5
/*end*/

/***ET+ VDHArmReturnHook recursive user stack usage
 *
 *	VDHARH_RECURSIVE_CSEIP_HOOK stack usage will vary depend
 *	on the VDM protected mode "bitness".   If 32 bit, there
 *	will be 8 bytes on the stack; otherwise, 4 bytes.
 */

#define VDHARH_RECURSIVE_STACK_USAGE	4
/*end*/

/***ET+ VDHPushFarCall user stack usage */

#define VDHPFC_STACK_USAGE		4
/*end*/

/***ET+ VDHPushInt user stack usage */

#define VDHPI_STACK_USAGE		6
/*end*/

/***ET+ VDHPushRegs/VDHPopRegs flags */

#define VDHREG_AX		0x00000001L
#define VDHREG_BX		0x00000002L
#define VDHREG_CX		0x00000004L
#define VDHREG_DX		0x00000008L
#define VDHREG_SI		0x00000010L
#define VDHREG_DI		0x00000020L
#define VDHREG_BP		0x00000040L
#define VDHREG_SP		0x00000080L
#define VDHREG_DS		0x00000100L
#define VDHREG_ES		0x00000200L
#define VDHREG_SS		0x00000400L
#define VDHREG_FLAG		0x00000800L
#define VDHREG_ALL		(VDHREG_AX | VDHREG_BX | \
				 VDHREG_CX | VDHREG_DX | \
				 VDHREG_SI | VDHREG_DI | \
				 VDHREG_BP | VDHREG_SP | \
				 VDHREG_DS | VDHREG_ES | \
				 VDHREG_SS | VDHREG_FLAG)
#define VDHREG_GENERAL		(VDHREG_AX | VDHREG_BX | \
				 VDHREG_CX | VDHREG_DX | \
				 VDHREG_SI | VDHREG_DI | \
				 VDHREG_BP | VDHREG_DS | \
				 VDHREG_ES | VDHREG_FLAG)
/*end*/

/***ET+ CRF - Client Register Frame
 *
 *	The EBX register points to the CRF structure on entry
 *	to I/O port handlers and VDD interrupt handlers.  VDDs
 *	can retrieve or modify the client's registers with this
 *	interface.
 */

typedef struct crf_s {
	ULONG crf_edi;
	ULONG crf_esi;
	ULONG crf_ebp;
	ULONG crf_padesp;
	ULONG crf_ebx;
	ULONG crf_edx;
	ULONG crf_ecx;
	ULONG crf_eax;
	ULONG crf_pad2[2];
	ULONG crf_eip;
	USHORT crf_cs;
	USHORT crf_padcs;
	ULONG crf_eflag;
	ULONG crf_esp;
	USHORT crf_ss;
	USHORT crf_padss;
	USHORT crf_es;
	USHORT crf_pades;
	USHORT crf_ds;
	USHORT crf_padds;
	USHORT crf_fs;
	USHORT crf_padfs;
	USHORT crf_gs;
	USHORT crf_padgs;
	ULONG crf_alteip;		/* other modes register set */
	USHORT crf_altcs;
	USHORT crf_altpadcs;
	ULONG crf_alteflag;
	ULONG crf_altesp;
	USHORT crf_altss;
	USHORT crf_altpadss;
	USHORT crf_altes;
	USHORT crf_altpades;
	USHORT crf_altds;
	USHORT crf_altpadds;
	USHORT crf_altfs;
	USHORT crf_altpadfs;
	USHORT crf_altgs;
	USHORT crf_altpadgs;
} CRF;

typedef CRF *PCRF;
/*end*/


/*c-begin */
/***ET+ Macros to improve VDM register manipulations from C */

#define AX(pcrf)    WORDOF(pcrf->crf_eax,0)
#define AL(pcrf)    BYTEOF(pcrf->crf_eax,0)
#define AH(pcrf)    BYTEOF(pcrf->crf_eax,1)
#define BX(pcrf)    WORDOF(pcrf->crf_ebx,0)
#define BL(pcrf)    BYTEOF(pcrf->crf_ebx,0)
#define BH(pcrf)    BYTEOF(pcrf->crf_ebx,1)
#define CX(pcrf)    WORDOF(pcrf->crf_ecx,0)
#define CL(pcrf)    BYTEOF(pcrf->crf_ecx,0)
#define CH(pcrf)    BYTEOF(pcrf->crf_ecx,1)
#define DX(pcrf)    WORDOF(pcrf->crf_edx,0)
#define DL(pcrf)    BYTEOF(pcrf->crf_edx,0)
#define DH(pcrf)    BYTEOF(pcrf->crf_edx,1)
#define SI(pcrf)    WORDOF(pcrf->crf_esi,0)
#define DI(pcrf)    WORDOF(pcrf->crf_edi,0)
#define BP(pcrf)    WORDOF(pcrf->crf_ebp,0)
#define SP(pcrf)    WORDOF(pcrf->crf_esp,0)
#define CS(pcrf)    WORDOF(pcrf->crf_cs,0)
#define IP(pcrf)    WORDOF(pcrf->crf_eip,0)
#define DS(pcrf)    WORDOF(pcrf->crf_ds,0)
#define ES(pcrf)    WORDOF(pcrf->crf_es,0)
#define SS(pcrf)    WORDOF(pcrf->crf_ss,0)
#define FL(pcrf)    WORDOF(pcrf->crf_eflag,0)

/* General purpose macros */

#define INT_PIC1BASE	0x08
#define INT_PIC2BASE	0x70
#define INTFROMIRQ(irq) (((irq) < 8)? (irq) + INT_PIC1BASE: \
				      (irq) - 8 + INT_PIC2BASE)
/*c-end */

/* VDHReadUBuf and VDHWriteUBuf flags */

#define VPM_FAULT_IF_RW_SET	0x01
#define VPM_FAULT_IF_SU_SET	0x02
#define VPM_SEL_PRESENT 	0x04
#define VPM_SEL_WRITEABLE	0x08
#define VPM_FAULT_IF_RO 	0x10
#define VPM_SEL_IS_SS		0x20
#define VPM_PROT_READ		0x40
#define VPM_PROT_WRITE		0x80
#define VPM_XCPTRET_ALT 	0x100

/***ET+ Hook routine typedefs */

typedef BYTE HOOKENTRY BIH(ULONG, PCRF);	/* I/O hook routines */
typedef VOID HOOKENTRY BOH(BYTE, ULONG, PCRF);
typedef WORD HOOKENTRY WIH(ULONG, PCRF);
typedef VOID HOOKENTRY WOH(WORD, ULONG, PCRF);
typedef BOOL HOOKENTRY OTH(ULONG, PULONG, ULONG, ULONG, PCRF);

typedef BYTE (*HOOKENTRY PBIH)(ULONG, PCRF);	/* pointers to I/O hook routines */
typedef VOID (*HOOKENTRY PBOH)(BYTE, ULONG, PCRF);
typedef WORD (*HOOKENTRY PWIH)(ULONG, PCRF);
typedef VOID (*HOOKENTRY PWOH)(WORD, ULONG, PCRF);
typedef BOOL (*HOOKENTRY POTH)(ULONG, PULONG, ULONG, ULONG, PCRF);

typedef BOOL HOOKENTRY FNHOOK(PCRF);		/* hook routine */
typedef BOOL (*HOOKENTRY PFNHOOK)(PCRF);	/* pointer to hook routine */

typedef VOID HOOKENTRY FNARM(); 		/* arm hook routine */
typedef VOID (*HOOKENTRY PFNARM)();		/* pointer to arm hook routine */


/***ET+ IOH - I/O Port Hook Entry
 *
 *	This is the structure for the parameter to the VDHInstallIOHook
 *	service.  Only the byte input and output handlers are required.
 *	A null (0) entry indicates that the type of I/O should be
 *	simulated.  The structure passed by VDHInstallIOHook is
 *	copied and saved away after the NULLs are replaced with the
 *	addresses of the simulation routines.
 */

typedef struct ioh_s {
	PBIH ioh_pbihByteInput; 		/* byte input handler */
	PBOH ioh_pbohByteOutput;		/* byte output handler */
	PWIH ioh_pwihWordInput; 		/* word input handler */
	PWOH ioh_pwohWordOutput;		/* word output handler */
	POTH ioh_pothOther;			   /* dword and string I/O handler */
} IOH;

typedef IOH *PIOH;				/* pointer to IOH entry */
/*end*/


/* 8086 emulation VDH services */

BOOL VDHENTRY VDHInstallIOHook(HVDM, PORT, ULONG, PIOH, FLAGS);
VOID VDHENTRY VDHRemoveIOHook(HVDM, PORT, ULONG, PIOH);
VOID VDHENTRY VDHSetIOHookState(HVDM, PORT, ULONG, PIOH, BOOL);
BOOL VDHENTRY VDHInstallIntHook(HVDM, ULONG, PFNHOOK, FLAGS);
HHOOK VDHENTRY VDHAllocHook(ULONG, PFNARM, ULONG);
PVOID VDHENTRY VDHQueryHookData(HHOOK);
VOID VDHENTRY VDHFreeHook(HHOOK);
VOID VDHENTRY VDHArmContextHook(HHOOK, HVDM);
VOID VDHENTRY VDHArmSTIHook(HHOOK, HVDM);
BOOL VDHENTRY VDHArmReturnHook(HHOOK, ULONG);
VPVOID VDHENTRY VDHArmBPHook(HHOOK);
BOOL VDHENTRY VDHPushInt(ULONG);
BOOL VDHENTRY VDHPopInt(VOID);
BOOL VDHENTRY VDHPushRegs(FLAGS);
BOOL VDHENTRY VDHPopRegs(FLAGS);
BOOL VDHENTRY VDHPushStack(ULONG,PVOID);
BOOL VDHENTRY VDHPopStack(ULONG,PVOID);
VOID VDHENTRY VDHSetA20(BOOL);
BOOL VDHENTRY VDHQueryA20(VOID);
VOID VDHENTRY VDHSetFlags(ULONG);
VOID VDHENTRY VDHSwitchToV86(VOID);
VOID VDHENTRY VDHSwitchToVPM(VOID);
BOOL VDHENTRY VDHCheckVPMIntVector(ULONG);
BOOL VDHENTRY VDHGetVPMIntVector(ULONG,PFPFN);
BOOL VDHENTRY VDHGetSelBase(SEL,PULONG);
BOOL VDHENTRY VDHChangeVPMIF(BOOL);
BOOL VDHENTRY VDHReadUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
BOOL VDHENTRY VDHWriteUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
BOOL VDHENTRY VDHCheckPagePerm(ULONG,PVOID,ULONG,ULONG);
BOOL VDHENTRY VDHRaiseException(ULONG,ULONG,ULONG);
BOOL VDHENTRY VDHStartHWInt(BOOL);
BOOL VDHENTRY VDHGetVPMExcept(ULONG,PFPFN,PBYTE);
BOOL VDHENTRY VDHProbeUBuf(SEL,ULONG,ULONG,ULONG);
BOOL VDHENTRY VDHPrepVPMIret(HHOOK);
BOOL VDHENTRY VDHPopVPMFarRet(VOID);

/* c-begin */
BOOL VDHENTRY VDHSetVPMIntVector(ULONG, FPFN);
BOOL VDHENTRY VDHSetVPMExcept(ULONG, FPFN, BYTE);
BOOL VDHENTRY VDHPushFarCall(FPFN);
/* c-end	*/
/* masm-begin */
/* VDHENTRY VDHSetVPMIntVector	<ULONG, ULONG, ULONG>  */
/* VDHENTRY VDHSetVPMExcept  <ULONG, ULONG, ULONG, BYTE>	*/
/* BOOL VDHENTRY VDHPushFarCall(ULONG, ULONG); */
/* masm-end	*/
FPFN VDHENTRY VDHArmVPMBPHook(HHOOK);
VOID VDHENTRY VDHEndUseVPMStack(VOID);
VOID VDHENTRY VDHBeginUseVPMStack(VOID);
/* c-begin */
extern ULONG flVdmStatus;
/* c-end	*/
[ RETURN TO DIRECTORY ]