Author: hbelusca Date: Sat May 2 20:48:08 2015 New Revision: 67518
URL: http://svn.reactos.org/svn/reactos?rev=67518&view=rev Log: [NTVDM]
Mouse: - Remove now useless code in mouse support in BIOS. - Implement INT 33h, AH=1Bh "Return mouse sensitivity" (returning hardcoded standard values since we don't support custom sensitivities) (AH=13h and 1Ah are marked as UNSUPPORTED). - INT 33h, AH=1Fh "Disable mouse driver" returns in ES:BX the old INT 33h vector value: implement that. - Implement INT 33h, AH=21h "Software reset", AH=24h and 4Dh and 6Dh "Software version and mouse info", "pointer to copyright string" and "version 'string'" functionalities.
DOS: - Initialize in Win2k3-ntvdm-compatible order the DOS drivers: NUL, then CON, then XMS, and then EMS. - Fix segment/offset inversion usage in INT 21h, AH=5Ch "Lock/Unlock region of file": when using MAKELONG macro to build a far pointer, the first parameter (loword) is the offset, and the second parameter (hiword) is the segment.
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.c trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.h trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.h
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/... ============================================================================== --- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.c [iso-8859-1] Sat May 2 20:48:08 2015 @@ -17,11 +17,7 @@ #include "bios32p.h"
#include "io.h" -#include "hardware/mouse.h" #include "hardware/ps2.h" - -// HACK: For the PS/2 bypass and MOUSE.COM driver direct call -#include "dos/mouse32.h"
/* PRIVATE VARIABLES **********************************************************/
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios/... ============================================================================== --- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/moubios32.h [iso-8859-1] Sat May 2 20:48:08 2015 @@ -11,63 +11,6 @@
/* DEFINES ********************************************************************/
-#if 0 // This code is for the MOUSE.COM driver - -enum -{ - MOUSE_BUTTON_LEFT, - MOUSE_BUTTON_RIGHT, - MOUSE_BUTTON_MIDDLE, - NUM_MOUSE_BUTTONS -}; - -typedef struct _MOUSE_USER_HANDLER -{ - /* - * CallMask format: see table: http://www.ctyme.com/intr/rb-5968.htm#Table3171 - * Alternatively, see table: http://www.ctyme.com/intr/rb-5981.htm#Table3174 - */ - USHORT CallMask; - ULONG Callback; // Far pointer to the callback -} MOUSE_USER_HANDLER, *PMOUSE_USER_HANDLER; - -typedef struct _MOUSE_DRIVER_STATE -{ - SHORT ShowCount; - COORD Position; - WORD Character; - WORD ButtonState; - WORD PressCount[NUM_MOUSE_BUTTONS]; - COORD LastPress[NUM_MOUSE_BUTTONS]; - WORD ReleaseCount[NUM_MOUSE_BUTTONS]; - COORD LastRelease[NUM_MOUSE_BUTTONS]; - SHORT HorizCount; - SHORT VertCount; - WORD MickeysPerCellHoriz; - WORD MickeysPerCellVert; - - /* - * User Subroutine Handlers called on mouse events - */ - MOUSE_USER_HANDLER Handler0; // Handler compatible MS MOUSE v1.0+ - MOUSE_USER_HANDLER Handlers[3]; // Handlers compatible MS MOUSE v6.0+ - - struct - { - WORD ScreenMask; - WORD CursorMask; - } TextCursor; - - struct - { - COORD HotSpot; - WORD ScreenMask[16]; - WORD CursorMask[16]; - } GraphicsCursor; -} MOUSE_DRIVER_STATE, *PMOUSE_DRIVER_STATE; - -#endif - /* FUNCTIONS ******************************************************************/
VOID BiosMousePs2Interface(LPWORD Stack);
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/d... ============================================================================== --- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] Sat May 2 20:48:08 2015 @@ -768,7 +768,6 @@ { setES(HIWORD(INDOS_POINTER)); setBX(LOWORD(INDOS_POINTER)); - break; }
@@ -1650,7 +1649,7 @@ if (getAL() == 0x00) { /* Lock region of file */ - if (DosLockFile(getBX(), MAKELONG(getCX(), getDX()), MAKELONG(getSI(), getDI()))) + if (DosLockFile(getBX(), MAKELONG(getDX(), getCX()), MAKELONG(getDI(), getSI()))) { Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF; } @@ -1663,7 +1662,7 @@ else if (getAL() == 0x01) { /* Unlock region of file */ - if (DosUnlockFile(getBX(), MAKELONG(getCX(), getDX()), MAKELONG(getSI(), getDI()))) + if (DosUnlockFile(getBX(), MAKELONG(getDX(), getCX()), MAKELONG(getDI(), getSI()))) { Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF; } @@ -2015,6 +2014,12 @@ RegisterDosInt32(0x29, DosFastConOut ); // DOS 2+ Fast Console Output RegisterDosInt32(0x2F, DosInt2Fh );
+ /* Load the CON driver */ + ConDrvInitialize(); + + /* Load the XMS driver (HIMEM) */ + XmsInitialize(); + /* Load the EMS driver */ if (!EmsDrvInitialize(EMS_TOTAL_PAGES)) { @@ -2022,12 +2027,6 @@ "Try reducing the number of EMS pages.\n"); }
- /* Load the XMS driver (HIMEM) */ - XmsInitialize(); - - /* Load the CON driver */ - ConDrvInitialize(); - return TRUE; }
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/m... ============================================================================== --- trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c [iso-8859-1] Sat May 2 20:48:08 2015 @@ -29,16 +29,25 @@
/* PRIVATE VARIABLES **********************************************************/
-#define MICKEYS_PER_CELL_HORIZ 8 -#define MICKEYS_PER_CELL_VERT 16 +// FIXME: Because I don't know a better place to store the string +// I temporarily put it in BIOS space. This need to be moved to a +// proper place when this driver is interfaced correctly with DOS. +#define COPYRIGHT_POINTER MAKELONG(0xE100, 0xF000) +static const CHAR MouseCopyright[] = "ROS PS/2 16/32-bit Mouse Driver Compatible MS-MOUSE 6.26 Copyright (C) ReactOS Team 1996-2015"; + +// See FIXME from above. +#define VERSION_POINTER MAKELONG(0xE160, 0xF000) +static PWORD Version; + +#define MICKEYS_PER_CELL_HORIZ 8 +#define MICKEYS_PER_CELL_VERT 16
static BOOLEAN DriverEnabled = FALSE; static MOUSE_DRIVER_STATE DriverState; static DWORD OldIrqHandler; +static DWORD OldIntHandler;
/* PRIVATE FUNCTIONS **********************************************************/ - -extern VOID WINAPI BiosMouseIrq(LPWORD Stack);
static VOID PaintMouseCursor(VOID) { @@ -590,6 +599,13 @@ break; }
+ /* Define Double-Speed Threshold */ + case 0x13: + { + DPRINT1("INT 33h, AH=13h: Mouse double-speed threshold is UNSUPPORTED\n"); + break; + } + /* Exchange Interrupt Subroutines, compatible MS MOUSE v3.0+ (see function 0x0C) */ case 0x14: { @@ -772,11 +788,31 @@ break; }
+ /* Set Mouse Sensitivity */ + case 0x1A: + { + DPRINT1("INT 33h, AH=1Ah: Mouse sensitivity is UNSUPPORTED\n"); + break; + } + + /* Return Mouse Sensitivity */ + case 0x1B: + { + DPRINT1("INT 33h, AH=1Bh: Mouse sensitivity is UNSUPPORTED\n"); + + /* Return default values */ + setBX(50); // Horizontal speed + setCX(50); // Vertical speed + setDX(50); // Double speed threshold + break; + } + /* Disable Mouse Driver */ case 0x1F: { - setES(0x0000); - setBX(0x0000); + /* INT 33h vector before the mouse driver was first installed */ + setES(HIWORD(OldIntHandler)); + setBX(LOWORD(OldIntHandler));
DosMouseDisable(); break; @@ -786,6 +822,75 @@ case 0x20: { DosMouseEnable(); + break; + } + + /* Software Reset */ + case 0x21: + { + /* + * See: http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte3sq8.htm + * for detailed information and differences with respect to subfunction 0x00: + * http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte3j74.htm + */ + + SHORT i; + + DriverState.ShowCount = 0; + DriverState.ButtonState = 0; + + /* Initialize the default clipping range */ + DriverState.MinX = 0; + DriverState.MaxX = MOUSE_MAX_HORIZ - 1; + DriverState.MinY = 0; + DriverState.MaxY = MOUSE_MAX_VERT - 1; + + /* Initialize the counters */ + DriverState.HorizCount = DriverState.VertCount = 0; + + for (i = 0; i < NUM_MOUSE_BUTTONS; i++) + { + DriverState.PressCount[i] = DriverState.ReleaseCount[i] = 0; + } + + /* Return mouse information */ + setAX(0xFFFF); // Hardware & driver installed + setBX(NUM_MOUSE_BUTTONS); + + break; + } + + /* Get Software Version, Mouse Type, and IRQ Number, compatible MS MOUSE v6.26+ */ + case 0x24: + { + setBX(MOUSE_VERSION); // Version Number + + // FIXME: To be determined at runtime! + setCH(0x04); // PS/2 Type + setCL(0x00); // PS/2 Interrupt + + break; + } + + /* Return Pointer to Copyright String */ + case 0x4D: + { + setES(HIWORD(COPYRIGHT_POINTER)); + setDI(LOWORD(COPYRIGHT_POINTER)); + break; + } + + /* Get Version String (pointer) */ + case 0x6D: + { + /* + * The format of the version "string" is: + * Offset Size Description + * 00h BYTE major version + * 01h BYTE minor version (BCD) + */ + setES(HIWORD(VERSION_POINTER)); + setDI(LOWORD(VERSION_POINTER)); break; }
@@ -883,6 +988,16 @@ /* Clear the state */ RtlZeroMemory(&DriverState, sizeof(DriverState));
+ /* Setup the version variable in BCD format, compatible MS-MOUSE */ + Version = (PWORD)FAR_POINTER(VERSION_POINTER); + *Version = MAKEWORD(MOUSE_VERSION/0x0100, MOUSE_VERSION%0x0100); + + /* Mouse Driver Copyright */ + RtlCopyMemory(FAR_POINTER(COPYRIGHT_POINTER), MouseCopyright, sizeof(MouseCopyright)-1); + + /* Get the old mouse service interrupt handler */ + OldIntHandler = ((PDWORD)BaseAddress)[DOS_MOUSE_INTERRUPT]; + /* Initialize the interrupt handler */ RegisterDosInt32(DOS_MOUSE_INTERRUPT, DosMouseService);
@@ -892,6 +1007,9 @@
VOID DosMouseCleanup(VOID) { + /* Restore the old mouse service interrupt handler */ + ((PDWORD)BaseAddress)[DOS_MOUSE_INTERRUPT] = OldIntHandler; + if (DriverState.ShowCount > 0) EraseMouseCursor(); DosMouseDisable(); }
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/m... ============================================================================== --- trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/mvdm/ntvdm/dos/mouse32.h [iso-8859-1] Sat May 2 20:48:08 2015 @@ -10,6 +10,11 @@ #define _MOUSE32_H_
/* DEFINES ********************************************************************/ + +// +// We are ROS PS/2 Mouse Driver Version 6.26, compatible MS-MOUSE 6.26 +// +#define MOUSE_VERSION MAKEWORD(0x26, 0x06)
#define DOS_MOUSE_INTERRUPT 0x33 #define MOUSE_IRQ_INT 0x74