Управление видеоадаптером
Изучение особенностей функционирования видеосистемы в текстовом режиме. Описание основных, вспомогательных функций и переменных. Написание алгоритма программы, разрешающей получать оригинальный динамический видеоэффект путем прямой записи в видеопамять.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 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