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

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

Результат работы представляется в графическом режиме в виде решетчатой функции на экране терминала.

Лабораторная работа № 7. Управление видеоадаптером

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

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

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

  • Организация видеопамяти в текстовом режиме.

  • Структура видеоадаптера.

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

Применяя прямую запись в видеопамять получить на экране оригинальный, желательно динамический видеоэффект. Возможны (но не обязательны) такие варианты видеоэффектов:

  • "теннисный мячик" - шарик, который летает по экрану и отражается от рамок и границ экраны;

  • "сухой лист" - опадание букв с экрана;

  • "жук-пожиратель" - фигурка, которая перемещается по экрану по случайной траектории и "съедает" буквы;

  • "удав" - то же, что и "жук", но к тому же он увеличивается в размерах, по мере "поедания" букв;

  • и т.д., и т.п.

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

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

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

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

  • весь экран (80х25 символов) условно делится на прямоугольники размером (10х5 символов).

  • текущий прямоугольник инвертирует экран под собой.

  • управлять положением текущего прямоугольника на экране можно с помощью клавиш управления курсором.

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

  • при нажатии клавиши Enter содержимое прямоугольников экрана начинает перемешивается случайным образом между собой до нажатия любой клавиши.

  • после этого, используя клавиатуру, можно восстановить начальный экран или выйти из программы (клавиша Esc).

5.4. Разработка алгоритм решения

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

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

  • byte GetSym(x1,y1) - функция читает символ с заданной позиции экрана дисплея.

  • byte GetAtr(x1,y1) - функция читает атрибут символа с заданной позиции экрана дисплея.

  • void PutSym(x1,y1,sym) - функция выводит на экран дисплея символ в заданную позицию (x1,y1).

  • void PutAtr(x1,y1,atr) - функция меняет на экране дисплея атрибут символа в заданной позиции (x1,y1).

  • void Invert(x1,y1) - функция инвертирует участок на экране размером (10х5), координаты (x1,y1) задают один из участков на экране.

  • void Change(x,y) - функция обменивает содержимое текущего участка с содержимым левого верхнего участка на экране. Координаты (x,y) задают положение текущего участка.

  • void RandText(void) - функция псевдослучайным образом перетасовывает все участки на экране.

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

Переменные, глобальные для всей программы:

  • xk - координата X текущего участка;

  • yk - координата Y текущего участка;

Координаты участка задаются в пределах: X - [0..7], Y - [0..4] .

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

Основная функция main() проверяет, был ли в командной строке дополнительный параметр. Если нет, программа не очищает старый экран. Если какой-нибудь параметр был, то экран очищается и выводится инструкция по управлению программой. Далее в основной программе выполняется бесконечный цикл, в котором обрабатываются коды нажатых клавиш и, в зависимости от них, вызываются вспомогательные функции. Выход из цикла - по клавише Esc.

Функции GetSym(x1,y1), GetAtr(x1,y1) читают непосредственно из видеопамяти дисплея символ и атрибут соответственно.

Функции PutSym(x1,y1,sym),  PutAtr(x1,y1,atr) выводят непосредственно в видеопамять дисплея символ и атрибут соответственно.

Во всех этих четырех функциях координаты задаются в квадрате 79х24 символов (нумерация начинается с нуля).

Функция Invert(x1,y1) использует функции GetAtr и PutAtr для инверсии прямоугольника экрана размером 10х5 по маске 0x7f, при этом независимо выполняется инверсия фона и цвета символа.

Функция Change(x,y) обменивает содержимое текущего участка с содержимым левого верхнего участка путем последовательного побайтного обмену атрибутов и символов. Она использует функции GetSym, GetAtr, PutSym, PutAtr.

Функция RandText(void) - псевдослучайным образом перетасовывает все участки на экране, при этом она в цикле увеличивает на единицу локальные в данной функции координаты текущего участка xk, yk и обращается к функции Change. Таким образом достигается эффект перемешивания. Функция работает, пока не будет нажата любая клавиша.