Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5.6. Результаты работы программы

В процессе работы программы на экран была выведена такая информация:

Лабораторная работа N4

Проверка состава оборудования

Тип компьютера: AT

Конфигурация:

Дисководов ГМД: 2

Математич. сопроцессор: есть

Тип дисплейного адаптера: VGA, кол., анал., 256 Кбайт

Первичный блок памяти: 16 Кбайт

Портов RS232: 2

Джойстик: нет

Принтеров: 1

Объем оперативной памяти: 639 Кбайт

Объем extended-памяти: 384 Кбайт

Адрес ПЗУ = c000. Длина модуля = 24576 байт

Версия MS-DOS 6.20

Лабораторная работа № 5. Управление клавиатурой

1. Цель работы

Изучение организации и принципов работы клавиатуры и закрепление практических навыков управления ею, а также практических навыков создания собственных программ обработки прерываний.

2. Темы для предварительного изучения

  • Организация и принцип работы ПЭВМ и клавиатуры.

  • Работа контроллера прерываний. Установка вектора прерывания.

3. Постановка задачи

Разработать программу обработки прерывания от клавиатуры, которая должна:

  • распознавать нажатие "горячей" комбинации клавиш и реагировать на него звуковым сигналом;

  • при первом нажатии "горячей" комбинации переходить в режим блокировки ввода заданной клавиши, при втором - отменять этот режим;

  • системная обработка всех других клавиш нарушаться не должна.

4. Порядок выполнения

Порядок выполнения работы и содержание отчета определены в общих указаниях.

5. Пример решения задачи

5.1. Индивидуальное задание.

  • комбинация клавиш LeftCtrl+RightShift+F3;

  • блокирование ввода клавиши 3.

5.2. Разработка алгоритма

5.2.1. Структура программы

Программа состоит из основной программы и трех функций.

  • void *readvect(int in) - функция читает вектор прерывания с номером in и возвращает его значение.

  • void writevect (int in, void *h) - функция устанавливает новый вектор прерывания in на новый обработчик этого прерывания по адресу h.

  • void interrupt new9() - процедура нового обработчика прерывания 9h.

5.2.2. Описание переменных

Глобальные переменные программы: old9 - адрес старого обработчика прерывания 9h; F3_code - скан-код клавиши "F3", которая входит в комбинацию "горячих" клавиш; key3_code - скан-код клавиши "3", которая будет блокироваться/разблокироваться при каждом нажатии "горячей" комбинации клавиш; f - флаг, который при каждом нажатии "горячей" комбинации клавиш переключается из состояния 0 в 1 или из 1 в 0 (состояние 1 означает, что клавиша "3" заблокирована); rr и sr - переменные, которые используются для задания значений регистров общего назначения и сегментных регистров соответственно при вызове прерывания.

В главной программе использует символьный массив string для проверки работы программы.

Переменные процедуры обработки прерывания 9h:

  • c - переменная, которая используется для подтверждения приема из клавиатуры, в случае, если была нажата клавиша "3", а флаг f показывал, что эта клавиша заблокирована;

  • x, y - переменные, которые используются для сохранения координат курсора на экране в момент вызова процедуры обработки прерывания;

  • byte17 - байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0017;

  • byte18 - байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0018;

  • mask - маска, которая используется для определения нажатия клавиши левый Shift (в этом случае бит 1 в byte17 установлен в 1);

  • mask17 - маска, которая используется для определения нажатия клавиши Сtrl (в этом случае бит 2 в byte17 установлен в 1);

  • mask18 - маска, которая используется для определения нажатия клавиши левый Сtrl (в этом случае бит 0 в byte18 установлен в 1);

5.2.3. Описание алгоритма программы

Главная программа выполняет такие действия:

  1. Запоминает адрес старого обработчика прерывания 9h, вызывая функцию readvect(in) с параметром in=9.

  2. Записывает в таблицу векторов прерываний адрес нового обработчика прерывания с помощью функции writevect().

  3. Вводом строки символов дает возможность проверить работу программы и ее реакцию на нажатие "горячей" комбинации клавиш и блокирование/разблокирование ввода клавиши "3".

  4. В конце работы восстанавливает в таблице векторов прерываний адрес старого обработчика.

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

  1. Прочитать флаги состояния клавиатуры (статус клавиш-переключателей), которые находятся в области данных BIOS (два байта по адресам 0040:0017 и 0040:0018).

  2. Выделить бит 1 в флаге по адресу 0040:0017 (если он равен 1, то нажата клавиша левый Shift).

  3. Выделить бит 2 в этом же флаге (если он равен 1, то нажата левый или правый Ctrl).

  4. Выделить бит 0 в флаге состояния клавиатуры по адресу 0040:0018 (если он равен 1, то нажата клавиша левый Ctrl).

  5. Из порта 60h прочитать скан-код нажатой клавиши.

  6. Если нажата комбинация клавиш левый Shift, правый Ctrl (нажата клавиша Ctrl, но это не правый Ctrl)и клавиша F3, то выполнить п.7. Иначе - перейти к п.8.

  7. Сигнализировать о нажатии "горячей" комбинации клавиш звуковым сигналом, переключить значение флага блокирования ввода клавиши "3" на обратное и вызвать старый обработчик прерывания от клавиатуры.

  8. Прочитав байт из порта 60h, определить, нажата ли клавиша 3" и если, кроме этого, еще и флаг блокирования указывает на то, что она заблокирована (f=1), то выполнить п.п. 9 и 10, иначе - вызвать старый обработчик прерывания.

  9. Послать подтверждение приема в клавиатуру. Для этого в порт 61h на короткое время выставить "1" по шине старшего разряда.

  10. Сбросить контроллер прерываний, посылая код 20h в порт 20h.

Функция readvect() читает вектор заданного прерывания. Для чтения вектора используется функция 35h DOS (прерывания 21h):

Вход:

AH = 35h; AL = номер вектора прерывания.

Выход:

ES:BX = адрес программы обработки прерывания

Функция writevect() устанавливает новый вектор прерывания на заданный адрес. Для записи вектора используется функция 25h DOS:

Вход:

AL = номер вектора прерывания; DS:BX = 4-байтный адрес нового обработчика прерывания.