This program (these programs?) is adapted from the mouse demo program published in PC Magazine. It continuously displays the mouse cursor location and state of the mouse buttons until the user clicks the left button in the "Quit" box. A variety of techniques were used in the various implementations; the C versions and Turbo Pascal version use a separate procedure for each mouse function, the QuickBasic version uses a single generic mouse procedure in which the desired function is one of the arguments passed to the procedure, and the Turbo Basic version does all the mouse stuff inline. The Quick Pascal version uses the Mouse unit. The Turbo C and Turbo Pascal versions both require that the file CGA.BGI exists in the current directory at runtime. The Quick Basic version requires the files QB.BI and QB.QLB if run in the integrated development environment, and requires the files QB.BI and QB.LIB to compile. Both C versions require the STDIO.H, DOS.H, and GRAPH.H (Microsoft) or GRAPHICS.H (Borland) header files. The Quick Pascal version requires the MSGraph and Mouse units (The Mouse unit is supplied with the Quick Pascal package in source form). The Turbo Pascal version requires the Dos and Graph units. The Turbo Basic version is a complete standalone. I undoubtedly could have done a better job of commenting the code, but I think there's enough info in there to allow you to write your own routines using these mouse functions. Rather than try to explain all the arcane PEEKs, VARPTRs, and DEF SEG's in the Turbo Basic version, I refer you to the Turbo Basic manual particularly the sections on assembly interfacing and the description of the REGS statement/function. All mouse functions are called via interrupt 33(hex) with the function number in the AX register. The other processor registers are used to pass various arguments both to and from the function. Here's a list of the functions the program uses : Mouse Reset and Status Input : AX = 0 Output: AX = -1 if mouse hardware & driver installed, else 0 BX = number of mouse buttons Show Cursor Input : AX = 1 Output : None Hide Cursor Input : AX = 2 Output : None Get Button Status and Information Input : AX = 3 Output : BX = button status (1 = left, 2 = right, and 4 =center. If more than one button is pressed, the sum will be returned (ie, both left and right = 3). CX = horizontal coordinate of current mouse location DX = vertical coordinate of current mouse location. Set Graphics Cursor Block Input : AX = 9 BX = Horizontal cursor hot spot CX = vertical cursor hot spot DX = offset address of cursor mask (32-word table) ES = segment address of cursor mask The hot spot is the single point where the cursor is considered to be, relative to the upper left corner of the graphic cursor. I used a hot spot of 7, 7 in the hourglass cursor; this places it in the center of the cursor (where the lines cross). Try changing this value and move the cursor to the corners of the screen to see what happens. The range of hotspot values is -127 to +128. Here's a few other useful mouse functions : Set Cursor Position Moves the mouse cursor to the specified location. Input : AX = 4 BX = horizontal cursor position CX = vertical cursor position Output : None Get Button Press Info Returns the number of times a button was pressed since the last call to function 5. Input : AX = 5 BX = which button to interrogate (0 = left, 1 = right) Output : AX = button status of all buttons, same format as function 3. BX = number of presses for requested button CX = horizontal cursor position at last button press DX = vertical cursor position at last button press Get Button Release Info Returns the number of times a button was released since the last call to function 6. Input : AX = 6 BX = which button to interrogate Output : AX = button status of all buttons BX = number of releases for requested button CX = horizontal cursor position at last button press DX = vertical cursor position at last button press Set Min and Max Horizontal Position Restricts horizontal cursor movement to specified area. Input : AX = 7 CX = Minimum horizontal position DX = Maximum horizontal position Output : None Set Min and Max Vertical Position Restricts vertical cursor movement to specified area. Input : AX = 8 CX = Minimum vertical position DX = Maximum vertical position Set Text Mode Cursor Sets mask values for text mode cursor. Input : AX = 10 BX = Cursor select (0 = software cursor, 1 = hardware cursor) CX = Screen mask (software) or scan line start (hardware) DX = Cursor mask (software) or scan line stop (hardware) Output : None The screen location (both attribute byte and character) is ANDed with the screen mask and XORed with the cursor mask, if software cursor. I don't believe anybody uses the hardware cursor which is similar to the normal text cursor. There are a total of 30-odd mouse functions for such things as light-pen emulation; setting, removing, and saving interrupts for movement and button presses; and mouse speed/sensitivity control. See the Microsoft Mouse Programmer's Reference, published by Microsoft Press, for more information. Note that it is generally a good idea to hide the mouse cursor before an output to the screen which might cause the screen to scroll and show it afterwards. Try moving the text cursor to the bottom line of the screen (LOCATE 25, 1; GotoXY 25, 1; etc) and print several linefeeds to see what happens to the mouse cursor.