Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОЭВМ_Лаба2.docx
Скачиваний:
6
Добавлен:
17.06.2023
Размер:
266.43 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра информационных систем

отчет

по лабораторной работе №2

по дисциплине «Организация ЭВМ и систем»

Тема: Исследование видеосистемы (текстовый режим).

Студенты гр. 9373

Заболотников М.Е. и Петрова С.В.

Преподаватель

Гречухин М.Н.

Санкт-Петербург

2020

Цель работы.

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

Теоретический материал.

  1. Общие положения.

Аппаратные средства вывода информации на экран включают специальную электронную плату и монитор. Видеоадаптеры – это мощные устройства, управляемые собственным микропроцессором.

В самом общем виде видеоадаптеры состоят из двух частей: контроллера и видеопамяти (видеобуфера). Более совершенные видеоадаптеры могут включать в себя ещё котроллер графики. Назначение видеобуфера – хранение образа информации экрана. 25 раз в секунду он формирует изображение на экране, которое строится по точкам – пикселам. Количество пикселов для разных видеоадаптеров – разное.

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

Управление параметрами видео системы может осуществляться на двух уровнях: на уровне портов видеоадаптера и посредством обращения к функциям BIOS.

  1. Видеорежимы и их краткая характеристика.

Интегральной характеристикой особенностей работы адаптера является совокупность поддерживаемых им режимов. Режимы принято нумеровать, начиная с нуля. Чем совершеннее видеоадаптер, тем больше режимов он поддерживает. Все видеоадаптеры делятся на графические и текстовые.

Если видеоадаптер включен в текстовый режим, то он рассматривает экран как совокупность так называемых текселов. Каждому текселу соответствуют 2 байта памяти видеобуфера. Байт по чётному адресу хранит код символа, который необходимо вывести, а второй – байт атрибута – информацию о цвете символа, фона, наличии мерцания и уровне яркости. Задавая определённые значения байту атрибута, мы задаём цвет символа и фона, на котором этот символ будет выведен, а также мерцание и уровень яркости.

Видеопамять адаптера при работе в текстовых режимах доступна непосредственно из программы. Это значит, что любая ячейка видеобуфера может быть прочитана программой так же, как и обычная ячейка оперативной памяти. И как в обычную ячейку памяти, в видеобуфер возможна запись значений из программы. Минимальная конфигурация видеоадаптера CGA имеет обычно 16К байт видеопамяти, что позволяет хранить 8 страниц текста в режимах 0 или 1 и 4 страницы в режимах 2 или 3.

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

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

  1. Функции консольного ввода и вывода.

Функции консольного ввода-вывода С++ помещены в файле <conio.h>, предназначены для облегчения работы по созданию простейшего оконного интерфейса. Эти функции используют понятие активного окна экрана. Активное окно — это прямоугольная область экрана, в границах которой в данный момент работают функции. Описание активного окна (или, как часто говорят, фрейм) хранится во внутренней структурной переменной С++. Установку параметров активного текстового окна выполняет функция

window(int, int, int, int);.

Она описывает активное текстовое окно: первая пара аргументов задает соответственно номера столбца и строки левого верхнего угла, вторая пара - правого нижнего угла. Строки и столбцы нумеруются, начиная от 1. Поэтому, например, координаты левого верхнего и правого нижнего углов экрана в режимах "25 строк х 80 столбцов" задаются парами (1,1) и (80,25).

Фрейм окна С++ имеет следующую структуру:

struct text_info {

unsigned char winright,

unsigned char winbottom; /* столбец, строка правого нижнего угла */

unsigned char attribute,

unsigned char normattr; /* атрибуты окна*/

unsigned char currmode; /* текущий режим работы видеоадаптера */

unsigned char screenheight; /* полная высота экрана */

unsigned char screenwidth; /* полная ширина экрана */

unsigned char сurх,

unsigned char сurу; }; /* строка, столбец текущей позиции курсора */

Информация об активном окне доступна при выполнении функции

gettextinfo( struct text_info *t);

При вызове эта функция заполняет поля структурной переменной, описанной по шаблону text_info, указатель t на которую она получает.

Функция window() инициализирует поля координат фрейма окна. Функции textcolor(), textbackground(), textattr() и другие управляют цветом отображаемых символов в окне.

  1. Управление курсором.

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

Программное прерывание 10h BIOS имеет в своем составе специальные функции для установки формы курсора, чтения и установки его координат.

Функция АН = 0lh задает высоту курсора. Регистр СН определяет номер верхней телевизионной линии, a CL - номер нижней линии при изображении курсора.

Среди функций консольного ввода-вывода С++ текущей позицией курсора в окне управляет функция gotoxy(int x, int y);.

Устанавливает курсор в заданную строку y и столбец x в текущем активном окне экрана. Верхний левый угол окна имеет координаты (1,1). При попытке по­зиционировать курсор за границы окна он останавливается на границе окна. Особенностью функции является то, что координаты задаются относительно левого верхнего угла текущего окна.

  1. Работа с текстовой информацией.

Вывод информации на экран персонального компьютера может выполняться на трёх уровнях: на уровне MS-DOS с использованием функций прерывания 21h, на уровне BIOS с использованием функции прерывания 10h или непосредственным доступом к аппаратным средствам.

Использование функций MS-DOS позволяет осуществить вывод через драйвер. Другие достоинства функций MS-DOS - автоматическое позиционирование курсора и скроллинг экрана, реакция на нажатие комбинации клавиш Ctrl-Break. Недостатком является невозможность непосредственного управления курсором и атрибутом символов. На уровне MS-DOS работают функции стандартного вывода, а их прототипы содержатся в файле <stdio.h>.

Вывод на уровне BIOS дает более широкие возможности по управлению экраном. Именно эти функции используются драйверами MS-DOS для вывода информации на экран. Недостатком функций BIOS является невысокая скорость вывода, что особенно заметно при работе в графических режимах. На уровне BIOS работают функции консольного вывода, а их прототипы помещены в файле <conio.h>.

  1. Скроллинг. Очистка окна и всего экрана.

Функции АН = 06 и 07 прерывания 10h BIOS осуществляют так называемый скроллинг (прокрутку) окна экрана. При выполнении скроллинга на одну строку вверх вся информа­ция в окне перемещается на строку вверх. Внизу окна появляется чистая строка. При выполнении скроллинга на одну строку вниз содержимое окна сдвигается на строку вниз и вверху окна добавляется чистая строка. Значение регистра AL задает число строк, на которое выполняется скроллинг. Если AL=0, выполняется очистка окна. Значения в СН и CL определяют строку и столбец левого верхнего угла окна, в DH и DL -строку и столбец правого нижнего угла. Строки и столбцы нумеруются от 0. Значение в регистре ВН задает атрибут добавляемой чистой строки.

Си-функции, выполняющей вертикальный скроллинг окна экрана, заданного строкой и столбцом левого верхнего (l_row, l_col) и строкой и столбцом правого нижнего (r_row, r_col) углов окна:

#include < dos. h >

void scroll (int direction, char l_row, char l_col, char r_row, char r_col, char attr)

{

union REGS r;

if (direction)

{

r.h.al = 1;

r.h.ah = direction;

}

else

{

r.h.al = 0;

r.h.ah = 6;

}

r.h.ch = l_row;

r.h.cl = l_col;

r.h.dh = r_row;

r.h.dl = r_col;

r.h.bh = attr;

int86(0x10, &r, &r);

}

Скроллинг окна средствами BIOS возможен как в текстовых, так и в графических режимах работы видеоадаптера. Скроллинг в графических режимах разных адаптеров может иметь некоторые особенности.

  1. Вывод информации в окно экрана.

С++ включает большой набор функций ввода-вывода информации в окно экрана. Прототипы этих функций помещены в заголовочном файле <conio.h>. В отличие от функций стандартного ввода-вывода они позволяют управлять цветом выводимых символов и не пересекают пределы активного в данный момент окна. При достижении правой вертикальной границы курсор автоматически переходит на начало следующей строки в пределах окна, а при достижении нижней горизонтальной границы выполняется скроллинг окна вверх.

Функция clreol() стирает в текстовом окне строку, на которую установлен курсор, начиная с текущей позиции курсора и до конца строки (до правой вертикальной границы окна).

Функция clrscr() очищает все текстовое окно. Цвет "заливки" окна при очистке будет соответствовать значению, установленному символической переменной attribute в описании окна (структурная переменная по шаблону text_info). Функции управления цветом фона и символа описаны далее.

Функция delline() стирает в текстовом окне всю строку текста, на которую установлен курсор.

Функция insline() вставляет пустую строку в текущей позиции курсора со сдвигом всех остальных строк окна на одну строку вниз. При этом самая нижняя строка текста окна теряется.

Функция cprintf( const char *format,...) выполняет вывод информации с преобразованием по заданной форматной строке, на которую указывает format. Является аналогом функции стандартной библиотеки printf (), но выполняет вывод в пределах заданного окна. В отличие от printf () функция cprintf () иначе реагирует на специальный символ '\n': курсор переводится на новую строку, но не возвращается к левой границе окна. Поэтому для перевода курсора на начало новой строки текстового окна следует вывести последовательность символов CR-LF (0x0d, 0x0a). Остальные специальные символы воздействуют на курсор так же, как и в случае функций стандартного ввода-вывода. Функция возвращает число выведенных байтов, а не число обработанных полей, как это делает функция printf () .

Функция cputs( char *str) выводит строку символов в текстовое окно, начиная с текущей позиции курсора. На начало выводимой ASCII-строки указывает указатель str. Является аналогом функции стандартной библиотеки puts (), но выполняет вывод в пределах заданного окна и при выводе не добавляет специальный символ '\n'. Реакция cputs() на специальный символ '\n' аналогична реакции cprintf(). Функция возвращает ASCII-код последнего выведенного на экран символа. В отличие от puts() в функции отсутствует возврат символа EOF. Другими словами, вывод происходит на экран в любом случае.

Функция movetext(int left, int top, int right, int bottom,int destleft, int desttop) переносит окно, заданное координатами левого верхнего (left, top) и правого нижнего (right, bottom) углов, в другое место на экране, заданное координатами левого верхнего угла нового положения окна. Размеры окна по горизонтали и вертикали сохраняются. Все координаты задаются относительно координат верхнего левого угла экрана (1,1). Функция возвращает ненулевое значение, если перенос заданного окна выполнен. В противном случае возвращается 0. Функция корректно выполняет перекрывающиеся переносы, т.е. переносы, в которых прямоугольная область-источник и область, в которую окно переносится, частично покрывают друг друга.

Функция putch(int ch) выводит символ в текущей позиции текстового окна экрана. Как и для функций cprintf(), cputs(), специальный символ ‘\n' вызывает только переход курсора на следующую строку текстового окна без возврата к его левой вертикальной границе. Остальные специальные символы воздействуют на курсор так же, как и для функций стандартного ввода-вывода.

Функция puttext(int left, int top, int right, int bottom,void *source) выводит на экран текстовое окно, заданное координатами левого верхнего (left, top) и правого нижнего (right, bottom) углов. Символы и атрибуты располагаются в буфере, адрес начала которого задает указатель source. Другими словами, функция "открывает" (восстанавливает) текстовое окно экрана. Обычно используется вместе с функцией gettext(), выполняющей обратную операцию - запись в буфер source символов/атрибутов, полностью описывающих все знакоместа текстового окна. Функция проверяет по заданным координатам окна, можно ли построить окно на экране для текущего режима видеоадаптера и корректны ли эти координаты. В случае, когда окно успешно выведено, возвращается ненулевое значение.

Функции highvideo(void), lowvideo(void) и normvideo(void) задают соответственно использование повышенной, пониженной и нормальной яркости для последующего вывода символов на экран.

Описываемые далее функции управляют атрибутом символа. Как отмечено ранее, атрибут задает битами 0-2 код цвета символа, бит 3 определяет повышение яркости, биты 4-6 задают код цвета фона символа, бит 7 определяет наличие или отсутствие мерцания символа. Возможно задать атрибут полностью либо задать только цвет символа или фона. Цвета могут задаваться либо числом, либо с использованием символических констант, значения которых определяет перечислимый тип COLORS.

Функция textattr(int newattr) устанавливает атрибут для функций, работающих с текстовыми окнами. Атрибут хранится в поле attribute структурной переменной по шаблону text_info, доступной через функцию gettextinfo().

Функция textcolor(int newcolor) задает цвет символов, не затрагивая установленный цвет фона. Цвет может быть или числом, или формироваться из символических констант, значения которых определяет перечислимый тип COLORS.

Функция textbackground(int newcolor) задает цвет фона символов, не затрагивая установленный цвет символа. Цвет может быть или числом, или формироваться из символических констант, значения которых определяет перечислимый тип COLORS.

Ход работы.

  1. Структурная схема аппаратных средств пк:

  1. Код программы:

#include<stdio.h> #include<conio.h> #include<dos.h> void scroll(int direction, char l_row, char l_col, char r_row, char r_col, char attr) { union REGS r; if(direction) { r.h.al = 1; r.h.ah = direction; } else { r.h.al = 0; r.h.ah = 6; } r.h.ch = l_row; r.h.cl = l_col; r.h.dh = r_row; r.h.dl = r_col; r.h.bh = attr; int86(0x10, &r, &r); } void INFO(int cvet, int t_cvet) { cprintf(“background: %i, “, cvet); switch(t_cvet) { case 0: cprintf(“text: BLACK”); break; case 1: cprintf(“text: BLUE”); break; case 2: cprintf(“text: GREEN”); break; case 3: cprintf(“text: CYAN”); break; case 4: cprintf(“text: RED”); break; case 5: cprintf(“text: MAGENTA”); break; case 6: cprintf(“text: BROWN”); break; case 7: cprintf(“text: LIGHTGRAY”); break; case 8: cprintf("text: DARKGRAY"); break; case 9: cprintf("text: LIGHTBLUE"); break; case 10: cprintf("text: LIGHTGREEN"); break; case 11: cprintf("text: LIGHTCYAN"); break; case 12: cprintf("text: LIGHTRED"); break; case 13: cprintf("text: LIGHTMAGENTA"); break; case 14: cprintf("text: YELLOW"); break; case 15: cprintf("text: WHITE"); break; } } void main() { int UP = 6; int cvet = 0; int t_cvet = 15; int chislo[8] = {0, 0, 0, 0, 0, 0, 0, 0}; unsigned char symbol; clrscr(); printf(“Enter 1 symbol: “); symbol = getch(); printf(“%c”, symbol); for(int c = 7; c >= 0; c--) { chislo[c] = symbol & (1 << c); if(!chislo[c]) chislo[c] = 1; } window(10, 5, 70, 15); gotoxy(2, 11); for(int j = 0; j < 8; j++) { t_cvet = 15; for(int k = 0; k < 16; k++) { scroll(UP, 5, 10, 15, 70, cvet<<4); gotoxy(2, 11); scroll(UP, 5, 10, 15, 70, 0); textbackground(cvet); textcolor(t_cvet); for(int d = 7; d >= 0; d--) { cprintf(“%i”, chislo[d]); } cprintf(“ “); INFO(cvet, t_cvet); t_cvet--; delay(300); } cvet++; } textattr((BLACK«4)|LIGHTGRAY); getch(); clrscr(); }

  1. Алгоритмы программы. Блок-схема.

Рис. 1.Алгоритм функции scroll();

Рис.2 Алгоритм функции INFO()

Рис. 3 Продолжение алгоритма INFO

Рис.4 Основной алгоритм программы часть 1

Рис. 5 Основной алгоритм программы 2 часть

  1. Ответы на контрольные вопросы.

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

  1. Типы видеосистем по типам видеоадаптеров: монохромный адаптер дисплея и принтера (MDA), цветной графический адаптер (CGA), усовершенствованный графический адаптер (EGA), видеографическая матрица (VGA).

  1. Основные характеристики видеосистем: Максимальное разрешение и частоты разверток (также зависит от возможностей монитора); Максимальное количество отображаемых цветов и оттенков (палитра); Скорость обработки и передачи видеоданных.

  1. Чем больше видеопамяти у адаптера, тем большее количество видеостраниц он способен хранить. В частности, с ростом объёма видеопамяти растёт и размер страницы, которую адаптер способен хранить при тех или иных режимах.

  1. Функция видеоадаптера состоит в преобразовании информации, хранящейся на носителе, в графическую и последующем выводе этой информации на экран. Теперь ещё добавились такие функции как аппаратное ускорение 2Dи 3Dграфики, обработка видеосигналов, прием телевизионных сигналов и т.п.

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

  1. Каждому текселу выделяется 2 байта. Первый хранит код символа, а второй особенности его отображения. В первом бите хранится значение, определяющее мерцание текста ( 0 – выключено, 1 – включено). Следующие 3 бита отвечают за соответствующие цвета фона: красный, зелёный, синий. При их смешении образуются новые цвета. Следующий бит отвечает за яркость символа, а последующие 3 отвечают за три цвета самого символа.

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

  1. Активное окно - это прямоугольная область экрана, в границах которой в данный момент работают функции. Описание активного окна (или, как часто говорят, фрейм) хранится во внутренней структурной переменной С++. Если необходимо выводить и вводить какую-то информацию в каком-то строго отведённом для этого участке, то для этого могут понадобиться окна.

  2. Существует возможность создавать несколько активных окон.

  1. Такие функции как: printf(), scanf(), cprintf(), cscanf(), puts(), cputs(), putch(), delline(), clrscr(), clreol(), insline(), window(), textcolor(), textbackground(), textattr().

  1. Например, gettextinfo(), gotoxy(), wherex(), wherey() и соответственно некоторые из тех, что были перечислены выше.

  1. Курсор – метка, указывающая на текущую позицию экрана, в которую запишется ил, из которой прочитается, символ. Управлять курсором можно при помощи уже упомянутой команды: gotoxy(), устанавливая его в нужную позицию. Также при помощи программного прерывания 10h BIOS можно задать форму и координаты курсора. Также узнать его позицию можно при помощи wherex(), wherey() или в полях curx, cury структурной переменной, заполняемой при вызове функции gettextinfo().

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

  1. Всего можно использовать 16 цветов текста и 8 цветов фона, поскольку значение цвета текста 0-7 – обычные цвета, 7-15 – цвета повышенной яркости, поскольку значение цифры, стоящей в 3 разряде влияет на яркость. У фона же значение цветов задаются от 0 до 8, поскольку следующий бит отвечает за мерцание, а не за цвет. Но у текселя может быть только один цвет символа и ещё один цвет фона.

  1. Для хранения цветов существует структура под названием enum COLORS, где перечислены все возможные цвета и их номера.

Соседние файлы в предмете Организация ЭВМ и вычислительных систем