Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебная практика 2-го курса.doc
Скачиваний:
20
Добавлен:
28.09.2019
Размер:
161.79 Кб
Скачать

Тема 4. Работа с манипулятором «мышь» Программа работы:

  1. Ознакомиться с принципами определения наличия драйвера «мыши» и самого устройства

  2. Изучить функции прерывания 33h

  3. Написать программы, показывающие перемещение мыши по экрану в текстовом и графическом режимах.

Краткие пояснения к изучаемому материалу

При работе на ПК часто используется манипулятор «мышь». Для организации взаимодействия с этим манипулятором необходим специальный драйвер. Загрузка драйвера осуществляется двумя путями. С помощью команды вида DEVICE= в файле конфигурации CONFIG.SYS или путем загрузки резидентной программы (например в файле автозапуска AUTOEXEC.BAT). Поддержка работы манипулятора «мышь» осуществляется через функции прерывания 33h.

Определение наличия драйвера и мыши в пк

Чтобы проверить установку драйвера, необходимо посмотреть содержимое вектора прерывания 33h. Это можно сделать, вызвав функцию 35h прерывания 21h. Она позволяет получить вектор прерывания, номер которого должен быть помещен в регистр AL. На выходе в регистрах ES:BX будет содержаться вектор прерывания. Если этот вектор равен 0000:0000, то драйвер мыши не установлен.

Assembler

mov ah, 35h

mov al, 33h

int 21h

cmp bx,0

je Met_no_driver

C, C++

_AH = 0x35;

_AL = 0x33;

geninterrupt(0x21);

if (_BX==0) …

Pascal

Var Regs : Register;

. . .

Regs.AH:=$35;

Regs.AL:=$33;

MsDos(Regs);

If Regs.BX=0 then …

В некоторых компьютерах в векторе 33h записана точка входа в программу, которая сразу же содержит команду возврата IRET (код этой команды 0CFh). Тогда для проверки установки драйвера необходимо выполнить проверку вида:

cmp byte ptr ES:[BX], 0CFh ; косвенная адресация, проверяется содержимое

; ячейки, адрес которой находится в ВХ

je Met_no_driver

Теперь необходимо убедиться в том, что манипулятор подключен к компьютеру. Чтобы это сделать, необходимо вызвать функцию 0 прерывания 33h. Если манипулятор не подключен, то в регистре АХ вернется значение 0.

Assembler

xor ah, ah

int 33h

cmp ax,0

je Met_no_mouse

C, C++

_AX = 0;

geninterrupt(0x33);

a_x = _AX;

if (a_x==0)

{ puts(“Мышь не подключена”);

exit(1); }

Pascal

Regs.AX:=0;

Intr($33,Regs);

If Regs.AX=0 then

begin

write(“Мышь не подключена”);

exit(1) end;

Функции прерывания 33h:

0 – проверяет, установлена ли мышь, переустанавливает драйвер и возвращает число кнопок манипулятора

АХ = 0 мышь не установлена

АХ = -1 мышь установлена

ВХ - число кнопок

1 – показывает курсор мыши на экране

Не возвращает никаких значений

2 – скрывает курсор мыши

Не возвращает никаких значений

3 – возвращает текущую позицию мыши и состояние ее кнопок

ВХ - состояние кнопок

СХ – горизонтальная координата

DХ - вертикальная координата

Приведем фрагмент программы на языке С, которая показывает перемещение курсора мыши и отображает в центре экрана ее текущие координаты. Для выхода из программы – нажать левую кнопку.

void main ()

{ int old_x = 0, old_y = 0, a_x, b_x, c_x,d_x;

_AH = 0x35;_AL = 0x33;

geninterrupt(0x21);

b_x = _BX;

asm { cmp byte ptr ES:[BX], 0CFh

jne Met_near }

b_x = 0;

Met_near:

If (b_x == 0) { puts (“Не установле драйвер мыши”); exit(1); }

_AX = 0;

geninterrupt(0x33);

a_x = _AX;

if (a_x==0) { puts (“Мышь не подключена”); exit(1); }

clrscr();

_AX = 1;

geninterrupt(0x33); //вывод курсора мыши

while (_AX = 3, geninterrupt(0x33), c_x = _CX, d_x = _DX, _BX != 2)

{ if (c_x != old_x) || (d_x != old_y) { old_x = c_x ; old_y = d_x ; }

else continue;

_AX = 2;

geninterrupt(0x33); //скрыть курсора мыши

gotoxy(30,10); printf (“%3d”, c_x);

gotoxy(30,11); printf (“%3d”, d_x);

_AX = 1;

geninterrupt(0x33); //вывод курсора мыши

}

_AX = 0;

geninterrupt(0x33); //переустановка драйвера мыши

clrscr();

}