Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Лабораторная работа № 13-14.  «Изучение особенностей функционирования видеосистемы». Краткие теоретические и учебно-методические материалы




Лабораторная работа № 13-14

 «Изучение особенностей функционирования видеосистемы»

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

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

- осуществлять разработку кода программного модуля на современных языках программирования;

- создавать программу по разработанному алгоритму как отдельный модуль;

- выполнять отладку и тестирование программы на уровне модуля

знать:

- основные этапы разработки программного обеспечения;

- основные принципы технологии структурного и объектно-ориентированного программирования;

- основные принципы отладки итестирования программных продуктов.

 

Краткие теоретические и учебно-методические материалы

по теме лабораторной работы

В абсолютном большинстве применений ПЭВМ комплектуются видеоадаптером одного из четырех основных типов:

· MDA (Monochrome Display Adapter - монохромный дисплейный адаптер) - текстовый режим: 80 колонок x 25 строк, разрешающая способность 720 x 348 точек, матрица символа 7 x 9, черно-белый;

· CGA (Color Graphics Adapter - цветной графический адаптер) - текстовый режим: 80 колонок x 25 строк, матрица символа 8 x 8, 16 цветов; графический режим: 640 x 200 точек - монохромный или 320 x 200 точек - 4 цвета из 16-цветовой палитры;

· EGA (Enhanched Graphics Adapter - улучшенный графический адаптер) - текстовый режим: 80 колонок x 25 строк, матрица символа 8 x 14, 16 цветов из 64-цветовой палитры; графический режим: 640 x 350 точек, 16 цветов из 64-цветовой палитры;

· VGA (Video Graphics Array - видеографический массив) - текстовый режим: 80 колонок x 25 строк, матрица символа 8 x 14, 16 цветов из 4096-цветовой палитры; графический режим: 640 x 480 точек при 16 цветах из 4096 и 320 x 200 при 256 цветах.

Видеоадаптер обслуживается прерыванием BIOS 0x10. Начиная с модели EGA обработчик этого прерывания располагается не в основном ПЗУ BIOS, а в расширении ПЗУ по адресу C000: 0000. Это прерывание и в исходном своем варианте имело много функций, а для новых типов адаптеров список его функций расширяется.

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

В текстовом режиме видеопамять для CGA, EGA, VGA начинается с адреса B800: 0000 (для MDA - B000: 0000). Видеопамять физически расположена на плате адаптера, но ее адреса входят в общее адресное пространство ПЭВМ и доступны программисту для чтения и для записи. Каждое знакоместо экрана в видеопамяти представлено двумя байтами, первый из которых содержит ASCIIZ-код символа, а второй - цветовой атрибут в формате: H R G B h r g b, где h, r, g, b - соответственно яркостная, красная, зеленая, синяя составляющие цвета символа; R, G, B - красная, зеленая, синяя составляющие цвета фона; H - атрибут мигания (или яркостная составляющая цвета фона). Таким образом, комбинация hrgb определяет номер одного из 16 возможных цветов отображения символов.

 

Пример:

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

Программа состоит из основной функции 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) - функция псевдослучайным образом перетасовывает все участки на экране.

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

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

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

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

Основная функция 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. Таким образом достигается эффект перемешивания. Функция работает, пока не будет нажата любая клавиша.

#include < dos. h>

#include < stdio. h>

#include < stdlib. h>

#include < conio. h>

#include < time. h>

/*-----------------------Константы----------------------- */

#define VSEG 0xb800  /* Сегментный адрес видеопамяти */

#define byte unsigned char

#define word unsigned int

#define Esc 27

#define Spase 32

#define Enter 13

#define Up 0x48

#define Down 0x50

#define Left 0x4b

#define Right 0x4d

#define Home 0x47

int xk, yk;

/*--------------Чтение символа из видеопамяти-------------*/

byte GetSym(x1, y1)

int x1, y1;

{

 return(peekb(VSEG, y1*160+x1*2));

}

/*-------------Чтение атрибута из видеопамяти-------------*/

byte GetAtr(x1, y1)

int x1, y1;

{

 return(peekb(VSEG, y1*160+x1*2+1));

}

/*-------------Запись символа в видеопамять--------------*/

void PutSym(x1, y1, sym)

int x1, y1;

byte sym;

{

 pokeb(VSEG, y1*160+x1*2, sym);

}

/*-------------Запись атрибута в видеопамять--------------*/

void PutAtr(x1, y1, atr)

int x1, y1;

byte atr;

{

 pokeb(VSEG, y1*160+x1*2+1, atr);

}

/*------------Инверсия квадрата на экране-----------------*/

void Invert(x1, y1)

int x1, y1;

{

 byte b;

 int i, j;

 for (j=0; j< 5; j++)

for (i=0; i< 10; i++)

{

b=GetAtr(x1*10+i, y1*5+j);

PutAtr(x1*10+i, y1*5+j, (b^0x7f));

}

}

/*-------Замена текущего квадрата на левый верхний--------*/

void Change(x, y)

byte x, y;

{

 int i, j;

 byte ba, bs;

 if ((x! =0)||(y! =0))

for (j=0; j< 5; j++)

for (i=0; i< 10; i++)

{

bs=GetSym(x*10+i, y*5+j);

ba=GetAtr(x*10+i, y*5+j);

PutSym(x*10+i, y*5+j, GetSym(i, j));

PutAtr(x*10+i, y*5+j, GetAtr(i, j));

PutSym(i, j, bs);

PutAtr(i, j, ba);

}

}

/*------Перемешивание квадратов до нажатия клавиши------*/

void RandText(void)

{

 Invert(xk, yk);

 xk=5;

 yk=1;

 while(! kbhit())

 {

Change(xk, yk);

xk++;

if (xk> 7) xk=0;

yk++;

if (yk> 4) yk=0;

 }

 Invert(xk, yk);

}

/*----------------Начало основной программы---------------*/

main(int argn, char *argc[])

{

int i;

xk=0;

yk=0;

if (argn> 1){}

else       /* Если параметров нет, вывод инструкции */

{

textattr(10);

clrscr();

cprintf(" ---------------" );

cprintf("          Лабораторная работа N7         " );

cprintf(" ---------------" );

cprintf(" ---------------" );

cprintf("        Управление видеоадаптером.        " );

cprintf(" ---------------" );

textattr(15);

gotoxy(23, 4); cprintf(" Демонстрация работы с видеопамятью. " );

textattr(12);

gotoxy(30, 6); cprintf(" < < М О З А И К А > > " );

textattr(14);

gotoxy(30, 8); cprintf(" Клавиши управления: " );

gotoxy(7, 10); cprintf(" < Left, Right, Up, Down> - " );

 

        cprintf(" управление выделенним квадратом. " );

gotoxy(7, 11); cprintf(" < Spase Bar> - Обмен содержимым " );

        cprintf(" между выделенным квадратом" );

gotoxy(7, 12); cprintf("       и левым верхним" );

        cprintf(" квадратом. " );

gotoxy(7, 13); cprintf(" < Enter> - перемешивание квадратов" );

        cprintf(" до нажатия любой клавиши. " );

gotoxy(7, 14); cprintf(" < Esc> - вихiд. " );

textattr(11);

gotoxy(28, 16); cprintf(" З А Д А Ч А И Г Р И: " );

gotoxy(14, 17); cprintf(" Собрать при помощи клавиш " );

         cprintf(" управления начальный экран. " );

textattr(12);

gotoxy(27, 19); cprintf(" Ж е л а е м у с п е х а! " );

textattr(7);

gotoxy(1, 21); cprintf(" Примечание: При запуске с " );

         cprintf(" параметром < -> " );

gotoxy(13, 22); cprintf(" начальным экраном для игри " );

         cprintf(" является текущий. " );

}

Invert(xk, yk);

 for(i=0; i==0; )

switch(getch())

{ /* Обработка нажатых клавиш */

case Esc: i++; break;

case Enter: RandText(); break;

case Spase: Invert(xk, yk);

         Change(xk, yk);

         Invert(xk, yk);

         break;

case 0:

switch (getch()) {

    case Left: Invert(xk, yk);

               xk--;

               if(xk< 0) xk=7;

               Invert(xk, yk);

               break;

    case Right: Invert(xk, yk);

               xk++;

               if(xk> 7) xk=0;

               Invert(xk, yk);

               break;

    case Up: Invert(xk, yk);

               yk--;

               if(yk< 0) yk=4;

               Invert(xk, yk);

               break;

    case Down: Invert(xk, yk);

               yk++;

               if(yk> 4) yk=0;

               Invert(xk, yk);

               break;

     }

}

Invert(xk, yk);

}

 

Задания для лабораторной работы:

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

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

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

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

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

 

Контрольные вопросы:

1. Назовите и опишите основные типы видеоадаптеров.

2. Что такое разрешающая способность?

3. Назовите характеристики видеопамяти.

4. Как считается адрес видеопамяти.

5. Расшифруйте HRGBhrgb?

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...