Манипулятор "мышь" фирмы Microsoft

Подключение

Манипулятор "мышь" фирмы Microsoft подключается к компьютеру через интерфейс в стандарте RS232. Прибор потребляет достаточно малый ток, поэтому для питания его обычно используются некоторые сигнальные линии.

В таблице приведено соответствие выводов этого разъема и разъема манипулятора. Нумерация выводов соответствует разъему РП15-9 ( она отличается от американской, указанной на разъеме манипулятора).

компьютер "мышь"
1 1
8 2+8 (выводы соединить)
3 3
4 4

Инициализация

Передача осуществляется со скорость 1100 бод, а не 9600, как исходно настроен контроллер последовательного интерфейса, поэтому перед началом работы с манипулятором необходимо настроить канал таймера, определяющий тактовую частоту передатчика:

    MVI    A,68H    ;коэффициент деления для 1100 бод
    STA    0FB01H
    XRA    A
    STA    0FB01H

то же, на языке C:

    *(char *) 0xfb01 = 0x68;
    *(char *) 0xfb01 = 0;

Микросхема контроллера последовательного интерфейса уже инициализирована операционной системой, однако в случае возникновения ошибки (например, программа не успела принять байт, принятый контроллером, необходимо перед началом работы сбросить бит ошибки контроллера:

    MVI    A,35H
    STA    0FB11H    ;Инициализация UART

то же, на языке C:

    *(char *) 0xfb11 = 0x35;

Принцип действия манипулятора следующий:

Формат посылки

Манипулятор посылает посылку из трех байт. Во всех трех седьмой, старший бит, равен нулю. Шестой бит является флагом первого байта в посылке - он равен 1 в этом байте и равен нулю в двух остальных. Относительное перемещений мыши по каждой координате передается в виде однобайтового числа со знаком.

Формат первого байта:
Формат первого байта

Формат второго байта:
Формат второго байта

Формат третьего байта:
Формат третьего байта

Обработка посылки программой

Ниже приведен фрагмент программы на языке C, обслуживающий манипулятор.

    /* Текущие значения координат и состояния клавишей */
    int Button_1, Button_2;
    int X_mouse, Y_mouse;

    /* Байты посылки */
    char b1, b2, b3;

    /* Значения смещения манипулятора по обеим осям */
    int dx, dy;

    /* 1. Принять три байта посылки: b1, b2 и b3. */
    b1 = byte_from_RS232();
    b2 = byte_from_RS232();
    b3 = byte_from_RS232();

    /* 2. Произвести изменение переменных координат и клавишей */
    Button_1 = (b1 & 0x20) != 0;
    Button_2 = (b1 & 0x10) != 0;

    dx = ((b1 & 3) << 6) + (b2 & 0x3f);
    if (dx & 0x80)    dx |= 0xff00; /* Учет знака */

    dy = ((b1 & 0xc) << 4) + (b3 & 0x3f);
    if (dy & 0x80)    dy |= 0xff00; /* Учет знака */

    X_mouse += dx;     Y_mouse += dy;