ПРОГРАМУВАННЯ ТЕКСТОВИХ ЗОБРАЖЕНЬ НА ОСНОВІ ФУНКЦІЙ КОНСОЛЬНОГО ВВЕДЕННЯ-ВИВЕДЕННЯ ДАНИХ І БЕЗПОСЕРЕДНЬОГО ЗВЕРТАННЯ ДО ВІДЕОПАМ’ЯТІ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Комп’ютерні науки
Кафедра:
Не вказано

Інформація про роботу

Рік:
2003
Тип роботи:
Методичні вказівки
Предмет:
Програмно-орієнтовані мови програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка”  ПРОГРАМУВАННЯ ТЕКСТОВИХ ЗОБРАЖЕНЬ НА ОСНОВІ ФУНКЦІЙ КОНСОЛЬНОГО ВВЕДЕННЯ-ВИВЕДЕННЯ ДАНИХ І БЕЗПОСЕРЕДНЬОГО ЗВЕРТАННЯ ДО ВІДЕОПАМ’ЯТІ Методичні вказівки до курсу “ПРОБЛЕМНО-ОРІЄНТОВАНІ МОВИ ПРОГРАМУВАННЯ” для студентів базового напрямку 0804 “Комп’ютерні науки” Львів - 2003 ВСТУП Керування роботою програми за допомогою клавіатури і відображення результатів виконання програми на екрані монітора (відоме як консольне введення/ виведення) є основною формою обміну інформацією з користувачем. Для здійснення операцій консольного введення/виведення у програмах на мові С можна використовувати різні засоби: звертання до бібліотечних функцій введення/виведення даних; виклик відповідних системних переривань BIOS або MS DOS; безпосереднє програмування апаратних пристроїв клавіатури та відеоадаптера. Бібліотечні функції, які підтримуються ANSI/ISO стандартами мови С, здійснюють буферизований потокоорієнтований обмін даними – так зване високорівневе введення/виведення. Прототипи цих оголошені у заголовному файлі <stdio.h>. Разом з тим бібліотека системи програмування Borland (Turbo) C/C++ містить спеціальні функції консольного введення/виведення даних, оголошені в <conio.h>. Ці функції не належать до стандартизованих, оскільки вони орієнтовані на конкретне апаратне забезпечення комп’ютерів. Проте використання їх дозволяє значно розширити можливості щодо обміну даними з консольними пристроями введення/виведення інформації. ФУНКЦІЇ БІБЛІОТЕКИ BORLAND С/C++ КОНСОЛЬНОГО ВИВЕДЕННЯ ТЕКСТОВИХ ЗОБРАЖЕНЬ 1. Загальна характеристика функцій консольного виведення. Функції консольного виведення, прототипи яких записані у заголовному файлі <conio.h>, забезпечують достатньо високу швидкодію та додаткові можливості щодо керування формою відображення інформації на екрані, порівняно з функціями потокоорієнтованого виведення. Повний перелік функцій консольного виведення наведено в табл. 1. Всі функції консольного виведення умовно можна поділити на п’ять груп:  функції встановлення атрибутів символів: textcolor, textbackground, textattr,  highvideo,  lowvideo,  normvideo; функції формування текстових вікон та роботи з вікнами:  window, clrscr,  gettext,  puttext,  movetext;  функції виведення даних, символів і рядків:  putch,  cprintf,  cputs; функції редагування тексту у вікні екрану:  clreol,  delline,  insline; функції керування позицією та формою текстового курсора:  gotoxy,  wherex,  wherey,  _setcursortyрe. Таблиця 1 Функції керування консольним виведенням інформації Найменування функції Призначення  clreol Очищення рядка, починаючи з поточної позиції курсора  clrscr Очищення активного вікна екрану  cprintf Форматоване виведення даних  cputs Виведення символьного рядка  delline Витирання рядка, на якому знаходиться курсор  gettext Запис у буфер вмісту заданого текстового вікна  gotoxy Встановлення курсора у задану позицію  highvideo Встановлення режиму підвищеної яскравості символів  insline Введення пустого рядка в позицію курсора  lowvideo Встановлення режиму зменшеної яскравості символів  movetext Копіювання текстового вікна  normvideo Встановлення режиму нормальної яскравості символів  putch Виведення одного символа  puttext Відновлення текстового вікна з буфера  _setcursortyрe Встановлення форми текстового курсора  textattr Встановлення значеннь атрибутів символів  textbackground Встановлення кольору фону  textcolor Встановлення кольору символів  wherex Визначення горизонтальної координати курсора  wherey Визначення вертикальної координати курсора  window Створення вікна за заданими координатами  Далі подано більш детальний опис цих функцій. 2. Функції встановлення атрибутів символів. Кожен символ у відеопам'яті займає два байти: старший байт містить ASCII-код символа, а молодший – атрибути символа. Структуру байта атрибутів і призначення кожного біта цього байта показано на рис. 1. Змінюючи значення бітів байта атрибутів, можна змінювати колір символа (біти 0-3) та колір його фону (біти 4-6). 7 6 5 4 3 2 1 0  B/I r g b I R G B   Колір символа Яскравість Колір фону Мерехтіння / Інтенсивність Рис. 1. Структура байта атрибутів. Наприклад, якщо байт атрибутів має 16-е значення 0хас (10101100 – у 2-й системі числення), то виведений символ буде відображений яскраво-червоним кольором на зеленому фоні та блиматиме. Бібліотечні функції консольного виведення дають змогу задавати байт атрибутів повністю, або встановити тільки колір символа чи колір фону. Кольори можуть задаватися як відповідним числовим значенням, так і за допомогою констант, значення яких оголошені в переліку COLORS у заголовному файлі <conio.h>: enum COLORS { BLACK, /* 0 - чорний */ BLUE, /* 1 - синій */ GREEN, /* 2 - зелений */ CYAN, /* 3 - морської хвилі */ RED, /* 4 - червоний */ MAGENTA, /* 5 - рожевий */ BROWN, /* 6 - коричневий */ LIGHTGRAY, /* 7 - світло-сірий */ DARKGRAY, /* 8 - темно-сірий */ LIGHTBLUE, /* 9 - яскраво-синій */ LIGHTGREEN, /* 10 - яскраво-зелений */ LIGHTCYAN, /* 11 - яскраво-блакитний */ LIGHTRED, /* 12 - яскраво-червоний */ LIGHTMAGENTA, /* 13 - яскраво-рожевий */ YELLOW, /* 14 - жовтий */ WHITE, /* 15 - білий */ BLINK /* 128 - мерехтіння */ }; Встановлення кольору символів здійснює функція void textcolor (int color); Параметр color задає колір символів. Колір може задаватися як числовим значенням, так і символічною константою із переліку COLORS. Всі наступні виведення тексту будуть здійснюватись цим кольором. За замовчуванням символи мають білий колір. Колір фону встановлює функція void textbackground (int bkcolor); Параметр bkcolor задає колір фону символів. Оскільки для кольору фону виділено три біти в байті атрибутів (4-6), то стандартно кольори фону обмежено значеннями від 0 до 7. Якщо встановити значення кольору фону з діапазону 8..15, то символи будуть блимати, бо одиницю буде занесено в біт мерехтіння (біт 7 байта атрибутів). За замовчуванням встановлюється чорний колір фону. Зауваження. Через BIOS-переривання або безпосереднім програмуванням регістрів відеоадаптера можна перепризначити 7-й байта атрибутів і використовувати його для розширення палітри кольорів фону (значення 0..15 з переліку COLORS). Встановлення значення повного байта атрибутів здійснює функція void textattr (int attr); Функція встановлює задане значення атрибутів символів attr для всіх наступних функцій консольного виведення. Атрибути можна задавати числовим значенням, або формувати з символічних констант переліку COLORS. Наприклад, якщо значення атрибутів задати так: textattr ( GREEN << 4 | YELLOW ); то виводитимуться жовті символи на зеленому фоні. Щоб забезпечити мерехтіння символів, треба додати константу BLINK: textattr (YELLOW | GREEN << 4 | BLINK ); Наступні три функції: void highvideo (void); void lowvideo (void); void normvideo (void); задають відповідно підвищену, понижену та нормальну яскравості для символів, що виводяться на екран. Використовуються відносно рідко. 3. Функції формування текстових вікон. Функції даної групи дозволяють встановлювати активне текстове вікно та здійснювати операції над вікнами. Активним вікном називають прямокутну область екрану, в межах якої на даний час здійснюється виведення текстових повідомлень. Стандартно встановлюється повноекранне вікно. Змінити розміри вікна можна за допомогою функції void window (int left, int top, int right, int bot); Параметри функції задають кооординати вікна: перша пара аргументів (left, top) – координати лівого верхнього кута (left – горизонтальна координата, top – вертикальна координата), а друга пара (right, bot) – правого нижнього кута (right – горизонтальна координата, bot – вертикальна). Рядки та стовпці нумеруються, починаючи з 1 (рис.2). Функція void clrscr (void); здійснює очищення активного текстового вікна. Колір заповнення вікна при витиранні визначається останнім встановленим значенням кольору фону (через функції  textattr або textbackground). Якщо потрібно створити текстове вікно, оточене рамкою, то рекомендується виконати наступні дії: вивести рамку вікна в повноекранному режимі; відкрити вікно всередині рамки. Для формування рамки застосовують спеціальні символи псевдографіки, коди яких наведено в табл. 2. Рамку можна зображати символами, які складаються з однієї або з двох ліній. Зауваження. Символи з кодами, більшими за 128, у процесі набору тексту можна виводити наступним чином: при натиснутій клавіші Alt, на цифровій клавіатурі (спеціальна права частина клавіатури) набрати код даного символа. Таблиця 2 Коди символів, що застосовуються для побудови рамок вікон Символ Код Символ Код  ║ 186 │ 179  ═ 205 ─ 95  ╗ 187 ┐ 191  ╔ 201 ┌ 218  ╝ 188 ┘ 217  ╚ 200 └ 192   Приклад. Функція, яка формує текстове вікно з рамкою і заголовним надписом. # include <string.h> # include <conio.h> void OpenWindow (int x1, int y1, int x2, int y2, int, char* title) // x1, y1, x2, y2 – координати двох протилежних кутів вікна; // wcol, wbk – колір символів рамки вікна і колір фону; // title – вказівник на заголовок вікна { int x,y; int len; window (1,1,80,25); // встановлення повноекранного вікна textcolor (wcol); // задання кольору символів textbackground(wbk); // та кольору фону gotoxy(x1,y1); putch(201); // символ лівого верхнього кута рамки вікна '╔' for (x=x1+1;x<x2;x++) // виведення верхньої лінії рамки вікна putch(205); // символ '═' putch(187); // символ правого верхнього кута рамки вікна '╗' for (y=y1+1;y<y2;y++) { // виведення бокових ліній рамки вікна gotoxy(x1,y); getch(186); // символ '║' gotoxy(x2,y); putch(186); } gotoxy(x1,y2); putch(200); // символ лівого нижнього кута рамки вікна '╚' for (x=x1+1;x<x2;x++) // виведення нижньої лінії рамки вікна putch(205); putch(188); // символ правого нижнього кута рамки вікна '╝' if ((len=strlen(title))!=0) { // якщо задано заголовок вікна x=(x2-x1+1-(len+2))/2; // віддаль заголовку від краю вікна if (x>1) { // якщо заголовок можна вмістити, то виводимо його gotoxy (x1+x+1,y1); putch(' '); cputs (text); putch(' '); } } window (x1+1,y1+1,x2-1,y2-1); // відкриваємо вікно всередині рамки clrscr(); } Приклад звертання до функції: OpenWindow (25,8,55,20,LIGHTGREEN,BROWN,"Результати"); Якщо треба побудувати вікно з тінню, то доцільно виконати таку послідовність дій: за допомогою функції window відкрити у повноекранному режимі вікно тіні зміщене вправо вгору або вниз відносно основного вікна; встановити колір фону (колір тіні) та зафарбувати це вікно (функції textbackground та clrscr); створити основне вікно (якщо потрібно, то з рамкою) за допомогою дій, описаних вище; встановити колір фону та колір символів для основного вікна і очистити його. Інформацію про параметри активного текстового вікна та загальноекранні характеристики можна отримати через функцію void gettextinfo(struct text_info *r); Функція має один параметр r, що є вказівником на структуру struct text_info, шаблон якої оголошений у <conio.h> наступним чином: struct text_info { unsigned char winleft; // координата лівої границі активного вікна unsigned char wintop; // координата верхньої границі активного вікна unsigned char winright; // координата правої границі активного вікна unsigned char winbottom; // координата нижньої границі активного вікна unsigned char attribute; // атрибут тексту активного вікна unsigned char normattr; // попередній атрибут тексту unsigned char currmode; // встановлений текстовий режим unsigned char screenheight; // вертикальний розмір екрану unsigned char screenwidth; // горизонтальний розмір екрану unsigned char curx; // поточна горизонтальна координата курсора unsigned char cury; // поточна вертикальна координата курсора }; У результаті виконання функції gettextinfo поля структури заповнюються відповідними даними про поточні параметри активного вікна та екрану. Використання функції дозволяє розробляти універсальні користувацькі функції роботи з вікнами. Приклад. Функція, що виводить задане повідомлення в правій частині останнього рядка активного текстового вікна. Повідомлення виводиться кольором, інверсним щодо кольору фону вікна. #include <conio.h> #include <string.h> void OutFinalMsg (char *msg) { int x,y; struct text_info winf; // змінна, в яку заносяться параметри вікна та екрану gettextinfo(&winf); // визначення параметрів активного вікна y=winf.winbottom-winf.wintop+1; // номер останнього рядка вікна x=winf.winright-winf.winleft-strlen(msg); // позиція початку повідомлення gotoxy(x,y); textcolor((~winf.attribute&0xf0)>>4); // встановлення інверсного кольору /* інвертуємо байт атрибуту, виділяємо параметр фону і зсуваємо його вправо */ cputs (msg); // виведення заданого повідомлення } Приклад звертання до функції: OutFinalMsg ("ESC – завершення роботи"); Для збереження, відновлення та копіювання екранного зображення, зокрема текстових вікон, можна використовувати три наступні функції. Функція int gettext (int left, int top, int right, int bot, void (buf); послідовно записує у буфер, заданий вказівником buf, символи та атрибути текстового зображення, заданого координатами лівого верхнього (left, top) та правого нижнього (right, bot) кутів. Координати задаються відносно лівого верхнього кута екрану (повноекранні координати). Буфер, адресу якого містить змінна buf, повинен бути попередньо виділеним у статичній або динамічній пам'яті. Необхідний мінімальний розмір буфера складає (right-left+1)((bot-top+1)(2 байт. Функція працює тільки в текстових режимах відеоадаптера. У випадку успішного копіювання заданого вікна у буфер функція повертає ненульове значення. Приклад. Функція, яка копіює текстове вікно заданого розміру в динамічну пам’ять і повертає адресу скопійованого вікна. # include <stdlib.h> # include <conio.h> void* SaveWindow (int left , int top, int winw, int winh) // left, top – координати лівого верхнього кута вікна; // winw, winh – розміри вікна { unsigned size=winw*winh*2; // розмір вікна в байтах void *buf; buf=malloc(size); // виділення динамічної пам’яті if (!buf) return NULL; // якщо недостатньо місця в динамічній пам’яті gettext(left,top,left+winw-1,top+winh-1,buf); // копіювання вікна return buf; } Для занесення в динамічну пам’ять текстового вікна з попереднього прикладу можна виконати таке звертання до даної функції: void *mem; int w=60-25+1, h=20-10+1; // розміи вікна mem=SaveWindow ( 25, 10, w, h); // збереження вікна Функція int puttext (int left, int top, int right, int bot, void (buf); виводить на екран у прямокутну область, задану координатами лівого верхнього (left, top) та правого нижнього (right, bot) кутів, символи з буфера пам'яті, адреса початку якого задається вказівником buf. Нумерація координат – повноекранна. При виведенні символів використовуються їх збережені атрибути Дана функція дозволяє ефективно відновлювати текстові вікна, попередньо збережені функцією gettext. У випадку, коли координати нового вікна задані коректно і успішно відбулось виведення тексту, функція повертає ненульове значення. Зауваження 1. Розміри вікна, скопійованого в buf, і розміри нового вікна, що відтворюється, можуть не співпадати. Якщо нове вікно менше за розміром, ніж те, що було занесене в buf, то виводяться тільки ті початкові символи з числа збережених, що вміщуються у нове вікно. Слід пам’ятати, що при цьому порушується структура вікна. Якщо ж нове вікно більше за збережене, то зайва частина вікна буде заповнена "сміттям". Зауваження 2. Відтворення зображення вікна не робить його активним (поточна позиція текстового курсора не змінюється). Щоб ативізувати нове вікно, треба скористатись функцією window. Приклад. Щоб відновити на екрані та зробити активним текстове вікно з рамкою, скопійоване в динамічну пам’ять у попередньому прикладі, розташувавши його в нижній правій частині екрану, треба звернутись до функцій: puttext (80-w+1,25-h+1,80,25,mem); // відновлення зображення вікна window (80-w+2,25-h+2,79,24,mem); // активізація вікна всередині рамки Хоча правий нижній кут рамки вікна потрапляє в точку (80,25), скролінг не виконується. Функція int movetext (int left, int top, int right, int bot, int newleft, int newtop); копіює вікно, задане координатами лівого верхнього (left, top) та правого нижнього (right, bot) кутів, в інше місце, задане координатами лівого верхнього кута нового положення (newleft, newtop). Базове вікно залишається на екрані. Розміри вікна по горизонталі та вертикалі зберігаються. Усі координати – повноекранні. Поточна позиція текстового курсора не змінюється. Функція повертає ненульове значення, якщо копіювання вікна виконано успішно, інакше повертає 0. 4. Функції виведення тексту у вікно екрану. Відображення символів, текстових рядків та числових даних всередині активного вікна програми виконують три, описані далі, функції виведення. При відображенні текстових даних використовується кольори символів та фону, встановлені в процесі останніх викликів функцій textcolor та textbackground (або textattr). Виведення здійснюється, починаючи з поточної позиції курсора, яку можна легко змінити за допомогою функції gotoxy. Виведення інформації здійснюється в межах активного вікна. При досягненні правої границі вікна виведення тексту автоматично продовжується з початку наступного рядка. У випадку, коли текст виходить за нижню праву границю вікна, відбувається вертикальний скролінг – всі рядки вікна зсуваються на один вгору – при цьому верхній рядок втрачається. Усі три функції по-іншому реагують на керуючі символи (escape-послідовності), ніж відповідні функції високорівневого буферизованого виведення. Зокрема, виведення керуючого символа '\n' викликає тільки перехід курсора на наступний рядок без встановлення його на початок цього рядка. Щоб перевести курсор на початок нового рядка, треба вивести керуючий символ '\r'. У випадку виведення символів горизонтальної або вертикальної табуляції '\t' і '\v'  не відбувається відповідне переміщення курсора, а виводиться одиночний символ, що відображає коди цих escape-послідовностей. Функція int putch (int ch); здійснює виведення символа ch у поточну позицію активного текстового вікна. Приклад застосування функції putch для різнокольорового виведення заданого символьного рядка – кожен символ рядка відображається іншим кольором на власному фоні, інверсному до кольору символа. char * text= "***ACBDF==0123456789==WXYZ***", *ps=text; int col=0; // колір символів while (*ps!='\0\) { textcolor (col); // встановлення кольору символів textbackground(~col); // встановлення інверсного кольору фону putch(*ps++); // виведення символів if (++col>15) col=0; // зміна кольору } Функція int cputs (const char * str); виводить рядок символів, адреса першого символа якого задається вказівником str, в активне текстове вікно, починаючи з поточної позиції курсора. Фукція повертає ASCII-код останнього виведеного на екран символа. На відміну від функції puts, cputs не переводить курсор на початок наступного рядка, а залишає його за останнім виведеним символом. Для встановлення курсора на початок нового рядка треба застосувати комбінацію символів "\n\r" або "\xd\xa". Функція int cprintf (const char *format, … ) виконує виведення різнотипної інформації з перетворенням відповідно до заданого форматного рядка, на який вказує format.  Дана функція є аналогом функції стандартної бібліотечної функції printf, але дозволяє виконувати виведення кольорових даних в межах активного вікна. Функція повертає загальну кількість виведених символів (а не кількість опрацьованих полів). Як і в попередній функції, в cprintf для переведення курсора на початок нового рядка треба застосувати комбінацію символів "\n\r" або "\xd\xa". Приклад використання функцій cprintf та cputs наведено в наступному параграфі. 5. Функції редагування тексту. До функцій редагування тексту відносяться: void clreol (void); – очищає рядок текстового вікна, на який встановлено курсор, починаючи з поточної позиції курсора і до кінця рядка; void delline (void); – витирає рядок, на який встановлено курсор, зі зсувом нижніх рядків угору; void insline (void) – вставляє пустий рядок в поточну позицію курсора зі зсувом наступних рядків униз. При цьому нижній рядок тексту, що виходить за межі вікна, втрачається. Приклад. Програма, яка заповнює текстом вікно, розташоване в центрі екрану. Після натискування на довільну клавішу витирається середній рядок і звільняється перший для нового запису. Перед завершенням роботи відновлюється стандартне повноекранне вікно. #include<conio.h> void main (void) { int ww=40, wh=8; // розміри вікна int x1,y1,x2,y2,r; x1=(80-ww)/2+1; x2=x1+ww-1; // горизонтальні координати вікна y1=(25-wh)/2+1; y2=y1+wh-1; // вертикальні координати вікна textcolor (14); // жовтий колір тексту textbackground(1); // синій фон window (x1,y1,x2,y2); clrscr(); for (r=1; r<wh; r++) // заповнення вікна текстом cprintf(" Рядок номер %d\n\r", r); cprintf(" Останній рядок "); // останній рядок виводимо без символа '/n', // щоб уникнути скролінга getch(); gotoxy (1,wh/2+1); delline(); // вилучення серединного рядка gotoxy(1,1); insline(); // введення пустого першого рядка cputs(" Новий рядок "); getch(); textattr (0x0f); // відновлення чорно-білого window (1,1,80,25); // повноекранного вікна clrscr(); } 6. Функції керування позицією та формою текстового курсора. Функція void gotoxy (int x, int y) встановлює текстовий курсор у позицію х рядка у активного вікна екрану. Функція використовує віконні координати – координата (1,1) відповідає лівому верхньому куту вікна. Якщо значення координат виходять за межі вікна, то курсор не пересувається. Поточні координати курсора в активному вікні повертають функції: int wherex (void); – горизонтальну координату (позицію курсора в рядку); int wherey (void); – вертикальну координату (номер рядка, на якому стоїть курсор). Форму курсора можна змінити за допомогою функції void _setcursortype (int curs); Параметр curs може приймати одне з трьох значень: 0 або _NOCURSOR – невидимий курсор; 1 або _SOLIDCURSOR – високий курсор (повне знакомісце); 2 або _NORMALCURSOR – звичайний курсор. Приклад. Далі наведено три функції, перша з яких робить текстовий курсор невидимим, друга – встановлює звичайне зображення курсора, а третя відновлює стандартні установки текстового режиму: повноекранне вікно, чорно-біле зображення, видимий невисокий курсор. void CursorOff (void) // відключення зображення курсора { _setcursortype(_NOCURSOR); } void CursorOn (void) // встановлення стандартного зображення курсора { _setcursortype(_NORMALCURSOR); } void RestoreFullScreen (void) // відновлення стандартного повноекранного вікна { textbackground(0); // чорний фон textcolor(15); // білий текст window (1,1,80,25); // повноекранне зображення clrscr(); CursorOn(); // видимий курсор } БЕЗПОСЕРЕДНЄ ЗВЕРТАННЯ ДО ВІДЕОПАМ’ЯТІ Безпосередній доступ до відеопам’яті (ВП) комп’ютера є найбільш швидким способом виведення інформації на екран і дає програмістові додаткові можливості для формування та опрацювання текстових повідомлень. Зокрема, тільки таким способом (або через BIOS-переривання) можна ( вивести символ у правому нижньому кутку екрану чи вікна, уникнувши скорлінга; ( розташувати текст на різних сторінках ВП; ( зчитати символ або його атрибут зі заданої позиції екрану тощо. Стандартні текстові режими роботи ВА дозволяють виводити на екран 25 рядків по 40 символів у рядку (режими 0 та 1) або 25 рядків по 80 символів (режими 2, 3 та 7). Основним текстовим режимом є режим номер 3. Кожен символ займає у ВП два байти: молодший байт містить ASCII-код символа, а старший байт – атрибути символа (рис. 3). Байт коду символа завжди записується у ВП за парною адресою, а байт атрибутів – за непарною. Структура байта атрибутів описана раніше і наведена на рис. 1. У текстових режимах ВП входить у загальний адресний простір центрального процесора ПК. Для кольорових відеоадаптерів початок ВП задається адресою B800h:0000h, для монохромних відеоадаптерів – адресою B000h:0000h. У текстових режимах відеоадаптерів VGA та SVGA ВП поділена на 8 сторінок з номерами 0..7, кожна з яких у режимі 25(80 символів має розмір 4 Кбайт (4096 байт). Одночасно може відображатись тільки одна сторінка – стандартно активною сторінкою є нульова. Для звертання до байтів ВП використовують far-вказівники. Сегментну частину адреси найчастіше приймають рівною адресі початку ВП (B800h для кольорових відеоадаптерів), а зміщення обчислюють за координатами символа на екрані з урахуванням номера відеосторінки: зміщення = ((рядок-1)*80 + (стовпчик-1))*2 + сторінка*4096. Приклад. Функція, яка здійснює виведення символа ch зі заданими атрибутами attr на нульовій сторінці ВП у позиції col рядка row. void OutSymbol (int ch, int attr, int row, int col) { char far *addr=(char far*)0xb8000000; // адреса початку ВП addr+=(row-1)*160+(col-1)*2; // адреса символа *addr=ch; // виведення ASCII-коду символа *(addr+1)=attr; // зміна атрибутів символа } Аналогічним чином можна зчитати з ВП значення ASCII-коду символа, заданого екранними координатами, і/або атрибути цього символа. В наведеній вище функції OutSymbol запис у ВП виконується побайтно: спочатку заноситься код символа, а потім байт атрибутів. Більш ефективним є запис одразу цілого слова, створеного з байта коду символа і байта атрибутів. Для формування адреси байта чи слова зручним є використання бібліотечного макроса MK_FP(unsigned seg, unsigned offset), оголошеного в заголовному файлі <dos.h>, який на основі заданих значень сегментної частини адреси ВП seg і зміщення offset формує фізичну адресу відповідного знакомісця. Приклад. Функція, яка здійснює виведення заданого символьного рядка st, починаючи з позиції екрану (x, y). Всі символи рядка відтворюючи з однаковими атрибутами attr. char* OutString (char *st, unsigned attr, int x, int y) { unsigned far *out; // адреса знакомісця char *pst=st; // вказівник на символи рядка if (x<1||x>80||y<1||y>25) // перевірка правильності координат return NULL; out=(unsigned far*)MK_FP(0xb800,((y-1)*80+x-1)*2); // адреса 1-го символа while (*pst!='\0') // цикл виведення рядка *out++=*pst++|attr<<8; return st; } Вираз (pst|attr << 8 формує слово зі значень коду і атрибутів поточного символа рядка. Подальшого підвищення швидкодії звертання до ВП можна досягти шляхом використання near-вказівників спеціальних типів: char _es ( або unsigned _es ( – перший застосовують для побайтової роботи з ВП, а другий – для запису/зчитування цілих слів. Такі near-вказівники містять тільки зміщення адреси символа, сегментна частина адреси перед звертанням до ВП повинна бути занесена в системний регістр ES. Приклад. Функція, яка здійснює зсув тексту рядка екрану з номером rn на одну позицію вліво (крайній лівий символ втрачається). У регістр ES заноситься адреса початку ВП, наступні звертання до знакомісць символів виконуються тільки через операції над зміщеннями адрес. #include <dos.h> void ShiftRow (int rn) { unsigned _es* off1=(char _es*)((rn-1)*160); // зміщення початку рядка unsigned _es* off2=off1+1; // зміщення першого символа, що зсувається int nc; // номер символа в рядку _ES=0xb800; // використовуємо псевдорегістрову змінну для занесення значення в регістр ES for (nc=1; nc<80; nc++,off1++,off2++) // цикл зсування рядка *off1=*off2; // перезапис символів } У функції застосовуються вказівники типу  unsigned _es (, що дозволяє переносити символи разом з їх атрибутами. Для виведення повідомлень на ненульову сторінку ВП треба задати відповідну початкову адресу сторінки ( наприклад, у сегментному регістрі). Зокрема, для виведення даних на k-у сторінку ВП треба зміститись від початку ВП на 4096(k байт. Щоб зробити довільну сторінку видимою, треба скористатись функцією 5h з переривання BIOS 10h. Приклад. Функція, що робить видимою сторінку ВП з номером page. #include <dos.h> void OutPage (int page) { _AH=5; // занесення номера функції в регістр ah _AL=page; // занесення номера сторінки в регістр al geninterrupt(0x10); // виклик переривання 10h } КОНСОЛЬНЕ ВВЕДЕННЯ ДАНИХ 1. Короткий опис процесу введення даних з клавіатури. Клавіші клавіатури ПК за призначенням можна поділити на декілька груп: символьні клавіші; клавіші керування: Hоme, End, PageUp, PageDn, Insert, Delete та клавіші стрілок; функціональні клавіші: F1..F12;шифт-клавіші: RightShift, LeftShift, Alt, Ctrl; тригерні (перемикаючі) клавіші: NumLock, ScrollLock, CapsLock, Insert; спеціальні клавіші клавіші: PrnScr, Pause/Break. Кожна клавіша клавіатури має свій порядковий номер, який називають скен-кодом клавіші. Керування роботою клавіатури здійснює спеціальний вбудований мікропроцесор – контролер клавіатури. У випадку натискуванні на якусь із клавіш або комбінацію клавіш контролер клавіатури передає в центральний процесор запит на переривання і номер клавіші (скен-код). Скен-коди клавіш різних груп опрацьовуються по-різному. Клавіші перших трьох груп називають клавішами з буферизацією розширеного коду. При натискуванні на такі клавіші у спеціальну ділянку пам’яті – буфер клавіатури – заноситься двобайтний код, що називається BIOS-кодом клавіші. Для символьних клавіш молодший байт цього коду встановлюється рівним ASCII-коду відповідного символа (крім натиснутої клавіші враховується стан Shift- і перемикаючих клавіш – велика чи маленька літера або спеціальна Ctrl-комбінація). В старший байт записується скен-код натиснутої клавіші. При натискуванні керуючих або функціональних клавіш, а також їх комбінацій з клавішами Alt, Ctrl чи Shift, та при натискуванні символьних клавіш разом з клавішею Alt у буфері клавіатури встановлюється BIOS-код, що має молодший байт рівний нулю,
Антиботан аватар за замовчуванням

18.02.2013 18:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!