diff options
| -rw-r--r-- | int2fwin.h | 48 | ||||
| -rw-r--r-- | makefile | 2 | ||||
| -rw-r--r-- | mousew16.c | 11 | ||||
| -rw-r--r-- | ps2.h | 5 | 
4 files changed, 64 insertions, 2 deletions
| @@ -32,6 +32,11 @@ enum int2f_functions  	INT2F_NOTIFY_FOREGROUND_SWITCH = 0x4002  }; +enum vxd_device_ids +{ +	VMD_DEVICE_ID = 0xC +}; +  static bool windows_386_enhanced_mode(void);  #pragma aux windows_386_enhanced_mode = \  	"mov ax, 0x1600" \ @@ -41,6 +46,49 @@ static bool windows_386_enhanced_mode(void);  	__value [al] \  	__modify [ax] +static LPFN win_get_vxd_api_entry(uint16_t devid); +#pragma aux win_get_vxd_api_entry = \ +	"mov ax, 0x1684" /* Get Device Entry Point Address */  \ +	"int 0x2F" \ +	__parm [bx] \ +	__value [es di] \ +	__modify [ax] + +/* VMD (Virtual Mouse Device) API */ + +enum vmd_apis { +	VMD_GET_VERSION    = 0x0, +	VMD_SET_MOUSE_TYPE = 0x100, +}; + +enum vmd_mouse_type { +	VMD_TYPE_UNDEFINED = 0, +	VMD_TYPE_BUS       = 1, +	VMD_TYPE_SERIAL    = 2, +	VMD_TYPE_INPORT    = 3, +	VMD_TYPE_PS2       = 4, +	VMD_TYPE_HP        = 5 +}; + +static inline int vmd_get_version(LPFN *vmd_entry); +#pragma aux vmd_get_version = \ +	"mov ax, 0x000" \ +	"call dword ptr es:[di]" \ +	__parm [es di] \ +	__value [ax] + +static inline bool vmd_set_mouse_type(LPFN *vmd_entry, uint8_t mousetype, int8_t interrupt, int8_t com_port); +#pragma aux vmd_set_mouse_type = \ +	"stc"                    /* If nothing happens, assume failure */ \ +	"mov ax, 0x100" \ +	"call dword ptr es:[di]" \ +	"setnc al" \ +	__parm [es di] [bl] [bh] [cl] \ +	__value [al] \ +	__modify [ax] + +/* Miscelaneous helpers. */ +  static inline void hook_int2f(LPFN *prev, LPFN new)  {  	*prev = _dos_getvect(0x2F); @@ -6,7 +6,7 @@  	set include=$(%watcom)/h/win;$(%watcom)/h  # The main driver file -vbmouse.drv: mousew16.c mousew16.h vbox.c vbox.h vboxdev.h ps2.h pci.h vds.h +vbmouse.drv: mousew16.c mousew16.h vbox.c vbox.h vboxdev.h ps2.h pci.h vds.h int2fwin.h  	# -bd to build DLL  	# -mc to use compact memory model (far data pointers, since ss != ds)  	# -zu for DLL calling convention (ss != ds) @@ -212,6 +212,15 @@ BOOL FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSegment,  	}  #endif +	// When running under protected mode Windows, let's tell VMD (the mouse virtualizer) +	// what type of mouse we are going to be using +	if (mouseflags & MOUSEFLAGS_HAS_WIN386) { +		LPFN vmd_entry = win_get_vxd_api_entry(VMD_DEVICE_ID); +		if (vmd_entry) { +			vmd_set_mouse_type(&vmd_entry, VMD_TYPE_PS2, PS2_MOUSE_INT_VECTOR, 0); +		} +	} +  	return 1;  } @@ -317,6 +326,6 @@ VOID FAR PASCAL Disable(VOID)  /** Called by Window to retrieve the interrupt vector number used by this driver, or -1. */  int FAR PASCAL MouseGetIntVect(VOID)  { -	return 0x74; /* This corresponds to IRQ12, the PS/2 IRQ. At least in VirtualBox. */ +	return PS2_MOUSE_INT_VECTOR;  } @@ -23,6 +23,11 @@  #include <stdbool.h>  #include <stdint.h> +/** Standard PS/2 mouse IRQ. At least on VirtualBox. */ +#define PS2_MOUSE_IRQ        12 +/** The corresponding interrupt vector for IRQ 12. */ +#define PS2_MOUSE_INT_VECTOR 0x74 +  enum {  	PS2M_STATUS_BUTTON_1 = 1 << 0,  	PS2M_STATUS_BUTTON_2 = 1 << 1, | 
