+ /* 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;
+ }
+