The old MicroSoft serial mouse, while no longer in general use, can be employed to provide a low cost input device, for example, coupling the internal mechanism to other moving objects. The serial protocol for the mouse is 1200 baud, 7 bit, 1 stop bit, no parity. The pinout of the connector is standard serial as shown below.

| Pin | Description | |
| 1 | DCD | Data carried detect |
| 2 | RD | Receive data |
| 3 | TD | Transmit data |
| 4 | DTR | Data terminal ready |
| 5 | SG | Signal ground |
| 6 | DSR | Data set ready |
| 7 | RTS | Request to send |
| 8 | CTS | Clear to send |
| 9 | Ring | |
Every time the mouse changes state (moved or button pressed) a three byte "packet" is sent to the serial interface. For reasons known only to the engineers, the data is arranged as follows, most notably the two high order bits for the x and y coordinates share the first byte with the button status.
| D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
| 1st byte | 1 | LB | RB | Y7 | Y6 | X7 | X6 |
| 2nd byte | 0 | X5 | X4 | X3 | X2 | X1 | X0 |
| 3rd byte | 0 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 |
Sample C code to decode three bytes from the mouse passed in "s", the button and position (x,y) are returned.
/*
s should consist of 3 bytes from the mouse
*/
void DecodeMouse(unsigned char *s,int *button,int *x,int *y)
{
*button = 'n'; /* No button - should only happen on an error */
if ((s[0] & 0x20) != 0)
*button = 'l';
else if ((s[0] & 0x10) != 0)
*button = 'r';
*x = (s[0] & 0x03) * 64 + (s[1] & 0x3F);
if (*x > 127)
*x = *x - 256;
*y = (s[0] & 0x0C) * 16 + (s[2] & 0x3F);
if (*y > 127)
*y = *y - 256;
}