Управление видеоадаптером

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

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 17.06.2010
Размер файла 25,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

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

УПРАВЛЕНИЕ ВИДЕОАДАПТЕРОМ

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

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

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

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

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

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

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

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

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

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

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

· и т.д., и т.п.

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

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

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

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

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

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

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

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

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

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

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

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

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

Текст программы

/*-----------------Лабораторная работа N7-----------------*/

/*---------------Управление видеоадаптером.---------------*/

#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(" Лабораторная работа N10 ");

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);

}

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

Результаты работы программы выводятся на экран терминала и меняются интерактивно.


Подобные документы

  • Написание программы для работы с клиентами средствами языка Delphi, которая предусматривает ввод, редактирование и удаление информации. Разработка алгоритма решения задачи, описание переменных, вспомогательных процедур, входных и выходных данных.

    курсовая работа [355,7 K], добавлен 21.09.2010

  • Написание транслятора посредством языка Си, обрабатывающего конструкции integer, if Le then, записи (record), а также реализующего обработку new для выделения динамической памяти: разработка алгоритма реализации задачи, представление листинга программы.

    курсовая работа [171,7 K], добавлен 03.07.2011

  • Изучение определения, описания и вызова функций, указателей и ссылок на них. Написание функции умножения произвольного столбца двумерного массива на const. Умножение 2 столбцов массива на константы. Составление блок-схемы алгоритма и текста программы.

    лабораторная работа [182,3 K], добавлен 09.01.2012

  • Разработка программы тестирования студентов по MS PowerPoint с кодом на языке Delphi. Создание алгоритма для решения функциональных требований задачи. Описание переменных, вспомогательных процедур, входных и выходных данных для реализации программы.

    курсовая работа [1,5 M], добавлен 21.09.2010

  • Разработка программы в среде программирования Borland Pascal, которая является электронным тестирующим пособием в области химии для 8-10 классов. Написание алгоритма решения задачи, определение необходимых функций, процедур, модулей, файловых переменных.

    контрольная работа [389,3 K], добавлен 19.09.2010

  • Анализ, математическая постановка задачи. Описание алгоритма работы основной программы. Детализация отдельных участков программы. Графический интерфейс программы "15". Описания используемых типов, глобальных переменных, процедур, функций. Процесс отладки.

    курсовая работа [48,8 K], добавлен 14.02.2009

  • Описание используемых в программе операторов, процедур, функций. Директива include. Правила объявления и определения функций в СИ++. Блок-схема алгоритма программы. Подпрограммы чтения из файла и записи в файл. Использование заголовочных файлов.

    курсовая работа [346,8 K], добавлен 26.04.2012

  • Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.

    курсовая работа [305,9 K], добавлен 03.07.2011

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

    курсовая работа [2,4 M], добавлен 17.01.2015

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.