Mouse driver services
---------------------

Below enumerated functions, which CTMOUSE implement:

INT 33/0000 - MS MOUSE - RESET DRIVER AND READ STATUS
INT 33/0001 - MS MOUSE v1.0+ - SHOW MOUSE CURSOR
INT 33/0002 - MS MOUSE v1.0+ - HIDE MOUSE CURSOR
INT 33/0003 - MS MOUSE v1.0+ - RETURN POSITION AND BUTTON STATUS
INT 33/0004 - MS MOUSE v1.0+ - POSITION MOUSE CURSOR
INT 33/0005 - MS MOUSE v1.0+ - RETURN BUTTON PRESS DATA
INT 33/0006 - MS MOUSE v1.0+ - RETURN BUTTON RELEASE DATA
INT 33/0007 - MS MOUSE v1.0+ - DEFINE HORIZONTAL CURSOR RANGE
INT 33/0008 - MS MOUSE v1.0+ - DEFINE VERTICAL CURSOR RANGE
INT 33/0009 - MS MOUSE v3.0+ - DEFINE GRAPHICS CURSOR
INT 33/000A - MS MOUSE v3.0+ - DEFINE TEXT CURSOR
INT 33/000B - MS MOUSE v1.0+ - READ MOTION COUNTERS
INT 33/000C - MS MOUSE v1.0+ - DEFINE INTERRUPT SUBROUTINE PARAMETERS
INT 33/000F - MS MOUSE v1.0+ - DEFINE MICKEY/PIXEL RATIO
INT 33/0010 - MS MOUSE v1.0+ - DEFINE SCREEN REGION FOR UPDATING
INT 33/0014 - MS MOUSE v3.0+ - EXCHANGE INTERRUPT SUBROUTINES
INT 33/0015 - MS MOUSE v6.0+ - RETURN DRIVER STORAGE REQUIREMENTS
INT 33/0016 - MS MOUSE v6.0+ - SAVE DRIVER STATE
INT 33/0017 - MS MOUSE v6.0+ - RESTORE DRIVER STATE
INT 33/001A - MS MOUSE v6.0+ - SET MOUSE SENSITIVITY
INT 33/001B - MS MOUSE v6.0+ - RETURN MOUSE SENSITIVITY
INT 33/001E - MS MOUSE v6.0+ - RETURN DISPLAY PAGE NUMBER
INT 33/001F - MS MOUSE v6.0+ - DISABLE MOUSE DRIVER
INT 33/0020 - MS MOUSE v6.0+ - ENABLE MOUSE DRIVER
INT 33/0021 - MS MOUSE v6.0+ - SOFTWARE RESET
INT 33/0023 - MS MOUSE v6.0+ - GET LANGUAGE FOR MESSAGES
INT 33/0024 - MS MOUSE v6.26+ - GET SOFTWARE VERSION, MOUSE TYPE, AND IRQ NUMBER
INT 33/0026 - MS MOUSE v6.26+ - GET MAXIMUM VIRTUAL COORDINATES
INT 33/0027 - MS MOUSE v7.01+ - GET SCREEN/CURSOR MASKS AND MICKEY COUNTS
INT 33/002A - MS MOUSE v7.02+ - GET CURSOR HOT SPOT
INT 33/0032 - MS MOUSE v7.05+ - GET ACTIVE ADVANCED FUNCTIONS
INT 33/004D - MS MOUSE - RETURN POINTER TO COPYRIGHT STRING
INT 33/006D - MS MOUSE - GET POINTER TO VERSION STRING

Functions below not implemented, but they not return anything, so user can
count they as implemented:

INT 33/000D - MS MOUSE v1.0+ - LIGHT PEN EMULATION ON
INT 33/000E - MS MOUSE v1.0+ - LIGHT PEN EMULATION OFF
INT 33/0013 - MS MOUSE v5.0+ - DEFINE DOUBLE-SPEED THRESHOLD
INT 33/001C - MS MOUSE v6.0+ - SET INTERRUPT RATE
INT 33/001D - MS MOUSE v6.0+ - DEFINE DISPLAY PAGE NUMBER
INT 33/0022 - MS MOUSE v6.0+ - SET LANGUAGE FOR MESSAGES

Next functions not implemented at all:

INT 10/04 - VIDEO - READ LIGHT PEN POSITION (except VGA)
INT 33/0011 - Genius Mouse 9.06 - GET NUMBER OF BUTTONS
INT 33/0012 - MS MOUSE - SET LARGE GRAPHICS CURSOR BLOCK
INT 33/0018 - MS MOUSE v6.0+ - SET ALTERNATE MOUSE USER HANDLER
INT 33/0019 - MS MOUSE v6.0+ - RETURN USER ALTERNATE INTERRUPT VECTOR
INT 33/0025 - MS MOUSE v6.26+ - GET GENERAL DRIVER INFORMATION
INT 33/0028 - MS MOUSE v7.0+ - SET VIDEO MODE
INT 33/0029 - MS MOUSE v7.0+ - ENUMERATE VIDEO MODES
INT 33/002B - MS MOUSE v7.0+ - LOAD ACCELERATION PROFILES
INT 33/002C - MS MOUSE v7.0+ - GET ACCELERATION PROFILES
INT 33/002D - MS MOUSE v7.0+ - SELECT ACCELERATION PROFILE
INT 33/002E - MS MOUSE v8.10+ - SET ACCELERATION PROFILE NAMES
INT 33/002F - MS MOUSE v7.02+ - MOUSE HARDWARE RESET
INT 33/0030 - MS MOUSE v7.04+ - GET/SET BallPoint INFORMATION
INT 33/0031 - MS MOUSE v7.05+ - GET CURRENT MINIMUM/MAXIMUM VIRTUAL COORDINATES
INT 33/0033 - MS MOUSE v7.05+ - GET SWITCH SETTINGS AND ACCELERATION PROFILE DATA
INT 33/0034 - MS MOUSE v8.0+ - GET INITIALIZATION FILE
INT 33/0035 - MS MOUSE v8.10+ - LCD SCREEN LARGE POINTER SUPPORT

Below enumerated implemented video functions:

INT 10/F0 - EGA Register Interface Library - READ ONE REGISTER
INT 10/F1 - EGA Register Interface Library - WRITE ONE REGISTER
INT 10/F2 - EGA Register Interface Library - READ REGISTER RANGE
INT 10/F3 - EGA Register Interface Library - WRITE REGISTER RANGE
INT 10/F4 - EGA Register Interface Library - READ REGISTER SET
INT 10/F5 - EGA Register Interface Library - WRITE REGISTER SET
INT 10/F6 - EGA Register Interface Library - REVERT TO DEFAULT REGISTERS
INT 10/F7 - EGA Register Interface Library - DEFINE DEFAULT REGISTER TABLE
INT 10/FA - EGA Register Interface Library - INTERROGATE DRIVER


Notes
-----

Unlike many other mouse drivers CTMOUSE don't require call INT 33/0002
  (Hide cursor) when you write to screen in text mode, because CTMOUSE
  simply don't restore screen under cursor if cursor pattern is injured;
  but, if character written without attribute - through INT 21 or through
  INT 10/0E (Teletype output) - then character get cursor attribute
For INT 33/0010 (Define region for updating) must be noted peculiarity of
  this function in bitmapped graphics modes 4-6 and 0Dh-12h, when position
  are truncated at step 8 and cursor occupy 24 pixels horizontally, unlike
  mode 13h, when cursor placed as is and occupy 16 pixels, as defined;
  i.e., for left limit L and right limit R cursor be hidden between
  (L-L%8)-16 and [R/8+1]*8-1 positions
To set update region by INT 33/0010 in sense of characters positions you
  must compute arguments as CX=left*W, DX=top*8, SI=(right+1)*W-1 and
  DI=(bottom+1)*W-1, where W=16 for modes 0-1, 4-5, 0Dh and 13h and W=8
  for all other modes
Unlike Microsoft specification, CTMOUSE always display cursor on active
  video page and do not require call INT 33/001D (Define display page
  number), which anyway is dummy
CTMOUSE support INT 33/0022 and 0023 (Set/get language for messages)
  functions, but they dummy and return code only for English respectively
When video mode changed (through INT 10/0), then CTMOUSE hides cursor,
  recalc screen sizes, clears ranges, centers cursor and clears mickey
  counts, same as by INT 33/0021 (Soft reset) function
Beside INT 10/0 (Set video mode) CTMOUSE don't catch any other functions,
  like 4Fh (VESA/SVGA functions), 1Ch (VGA state save/restore) or 11h
  (EGA/VGA character generation functions), so reset functions must be
  called manually
Call to INT 33/0020 (Enable driver) perform same actions as when video
  mode changed, except cursor not hided
CTMOUSE support detection of any screen sizes in addition to 40x25 and
  80x25, when INT 33/0000 (Reset driver) or INT 33/0021 (Software reset)
  is called or video mode changed; for nonstandard text modes or if screen
  size changed on the fly without calling reset functions, then proper
  screen limits can be manually forced (to enable cursor move through all
  screen) by INT 33/0007 (Define horizontal range) and INT 33/0008 (Define
  vertical range), which must be called with minrange=0/0 and
  maxrange=8*(screen width-1)/8*(screen height-1)
CTMOUSE display cursor only in standard video modes for CGA, EGA and VGA -
  Hercules Graphics Card nor Hercules InColor Card nor SVGA extended video
  modes does not supported; but cursor always can be displayed manually:
  hide cursor (INT 33/0002) (at least if nonstandard mode, like HGC, uses
  standard video mode number), define screen ranges (INT 33/0007 and 0008)
  and setup interrupt subroutine (INT 33/000C), which can display cursor
  when mouse moved


Used BIOS variables
-------------------

0:449h	bits 0-6 used to determine current video mode (when driver enabled
	by INT 33/0020 or video mode changed)
0:44Ah	screen width in text columns (used to compute offset in video
	memory in text video modes)
0:44Eh	offset in video segment of active video memory page
0:462h	current video page (returned by INT 33/001E)
0:463h	used to compute CRTC base and Feature Control video ports addresses
	(when driver enabled by INT 33/0020 or video mode changed)
0:487h	bits 5-6 used to determine RAM size on video adapter (when driver
	enabled by INT 33/0020 or video mode changed)
0:488h	bits 0-3 used to get video configuration switches (when driver
	enabled by INT 33/0020 or video mode changed)
0:4A8h	used to get default video registers values for RIL (when driver
	enabled by INT 33/0020 or video mode changed)


Used interrupts
---------------

INT 10/01	setup text-mode hardware cursor shape, when hardware
		cursor selected
INT 10/1A00	get DCC to check VGA presence
INT 15/C200	enable/disable PS/2 pointing device
INT 15/C203	set resolution of PS/2 pointing device [when PS/2 checking]
INT 15/C205	initialize PS/2 pointing device [when PS/2 checking]
INT 15/C207	set handler for PS/2 pointing device
INT 21/09	output all strings to standard output
INT 21/25	install interrupt handlers for INT 33, INT 10 and IRQ
		handler, also as restore those interrupts
INT 21/26	create new PSP for driver image in the UMB [when trying	to
		install driver high]
INT 21/31	remain TSR when driver not copied to other UMB segment
INT 21/35	save old INT 33, INT 10 and IRQ handlers addresses
INT 21/48	allocate UMB memory [when trying to install driver high]
INT 21/49	free memory, used by environment, and when unloading TSR
INT 21/4C	terminate program with nonzero errorlevel, if some error
		found, or with zero errorlevel when all fine
INT 21/58	modify memory allocation strategy [when trying to install
		driver high]
INT 2F/4310	get XMS driver entry [when trying to install driver high]
INT 33/001F	disable previous mouse driver, if they present
INT 33/0020	enable previous mouse driver after unloading CuteMouse


Used techniques
---------------

1. Two writes to adjacent I/O ports combined into one write "out dx,ax"
   (most video registers, divisor latch of COM port)
2. CuteMouse is written using TASM and makes use some of TASM features:
   for example, multiple push and pop on one line ("push ax bx") and
   shifts with an immediate value >1 ("shl ax,2"), which are converted
   into several opcodes valid for 8086/8088 CPUs (i.e. for shifts TASM
   simply duplicates them - "shl ax,1/shl ax,1"), because there is no
   ".186" and above statements
