- •Цели и задачи практики
- •Введение Аппаратные прерывания
- •Программные прерывания
- •Работа с прерываниями на языке Ассемблера и яву (с, Pascal)
- •Обмен данными через порты
- •Тема 1. Работа с видео-системой Теоретические вопросы:
- •Примерные варианты заданий
- •Тема 2. Программирование клавиатуры Теоретические вопросы:
- •Примерные варианты заданий
- •Тема 3. Работа с дисковыми накопителями Теоретические вопросы:
- •Примерные варианты заданий
- •Написать функцию, возвращающую объем доступного дискового пространства.
- •Тема 4. Работа с манипулятором «мышь» Программа работы:
- •Краткие пояснения к изучаемому материалу
- •Определение наличия драйвера и мыши в пк
- •Тема 5. Работа с таймером. Генерация звука. Теоретические вопросы:
- •Примерные варианты заданий
- •Список литературы
- •Приложение 1. Форма отчета
- •Приложение 2 вопросы к защите отчета по практике Вопросы к теме 1
- •Вопросы к теме 2
- •Вопросы к теме 3
Тема 4. Работа с манипулятором «мышь» Программа работы:
Ознакомиться с принципами определения наличия драйвера «мыши» и самого устройства
Изучить функции прерывания 33h
Написать программы, показывающие перемещение мыши по экрану в текстовом и графическом режимах.
Краткие пояснения к изучаемому материалу
При работе на ПК часто используется манипулятор «мышь». Для организации взаимодействия с этим манипулятором необходим специальный драйвер. Загрузка драйвера осуществляется двумя путями. С помощью команды вида 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();
}