Смекни!
smekni.com

Мова програмування Assembler (стр. 21 из 21)

Фірма IBM написала відеопрограму BIOS так, щоб вона могла працювати з двома дисплейними адаптерами, як з кольоровим графічним, так і з монохромним. Але BIOS також має на увазі, що з них активний тільки один. Це означає, що ви не зможете використовувати BIOS для того, щоб записати символ у кольоровий дисплей, а потім відразу використовувати BIOS для запису символу в монохромний дисплей. Відеопрограма BIOS може мати справу тільки з одним дисплейним адаптером.

Кожного разу, коли програма викликає відеопрограму BIOS, вона визначає, який дисплейний адаптер існує в системі за допомогою перевірки бітів поля EQUIP_FLAG, що відповідають поточному дисплею. Якщо біти 5 і 4 обоє рівні 1, то в системі присутній монохромний адаптер. Будь-яка інша установка біт говорить про те, що в системі працює кольоровий адаптер. Фірма IBM написала цю програму таким чином, виходячи з того, що система може мати тільки один дисплейний адаптер. Перед першим включенням машини ви повинні установити перемикачі на системній платі в положення, що показує, який адаптер дисплея використовується.

Інформація прапорів устаткування в полі EQUIP_FLAG визначає, яку з адрес буфера буде використовувати відеопрограма BIOS. Для монохромної плати BIOS завантажує в регістр ES значення 0B000H, а для кольорової плати - значення 0B800H. Це дозволяє іншим програмам дисплея BIOS працювати без використання інформації про те, який адаптер працює в системі. Усі посилання до буфера робляться щодо регістра ES.

Ви можете вирішити, що, оскільки поле EQUIP_FLAG показує, який адаптер використовується, можна переключатися від одного адаптера до іншого просто змінюючи біти в слові прапорів. На жаль, це не так, адреса введення-висновку контролера 6845 відрізняється для двох адаптерів, і BIOS записує цю базову адресу у свою область даних. Відеопрограма BIOS заносить у змінну ADDR_6845 ця адреса тільки при ініціалізації адаптера (команда AH = 0). Тому переключення від одного дисплея до іншого також вимагає коректування цієї змінної.

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

Фірма IBM опублікувала методи зміни одного дисплея іншим, як за допомогою програми мовою асемблера, так і за допомогою програми на Бейсике. У цих методах потрібно для вказівки адаптера, що ви хочете використовувати, змінити змінну EQUIP_FLAG, а потім використовувати відеопереривання INT 10H при AH = 0. Ця функція инициализирует адаптер і забезпечує правильну установку всіх полів дані програми BIOS. Після цього BIOS може працювати з тим дисплейним адаптером, що зазначений. При цьому картинка на іншому дисплеї залишається видимої. Крім того, дисплейний буфер того адаптера продовжує відображати будь-які зміні тексту і графіки, занесеної в нього. Так що ви можете змінювати вміст дисплейного буфера за допомогою вашої програми (а не за допомогою BIOS), щоб скорегувати інформацію, яка знаходиться на екрані, з якого ви тільки що переключилися.

Давайте розглянемо простий приклад. Ви маєте IBM PC із двома адаптерами - кольоровим графічним і монохромний, і до кожного адаптера підключений дисплей. Коли ви спочатку включаєте машину, система використовує монохромний дисплей. Саме з обліком цього ви і повинні установити перемикачі на системній платі, тому що монохромний дисплей може бути пошкоджений, якщо не буде ініціалізований відразу ж після включення живлення. Інструкція по роботі рекомендує, щоб ви установили перемикачі в положення, яка показує, що в системі присутній монохромний адаптер. Після цього ви можете використовувати відеопрограму BIOS з монохромним дисплеєм. Щоб перейти на кольоровий адаптер, можна виконати програму на рис.П9.7. Ця програма включає кольоровий адаптер у 80-символьному текстовому режимі. Символи, що були висвітлені на монохромному дисплеї, на ньому і залишаються, а ви тепер можете використовувати відеопрограму BIOS для роботи з кольоровим графічним дисплеєм. Але якщо вам буде потрібно змінити вміст монохромного дисплея, ви зможете зробити це, записавши нові символи чи атрибути в буфер дисплея за адресою 0B000H. Це не змінить положення курсору, але змінить картинку. У цьому випадку якщо ви хочете змінювати текст одночасно на кольоровому і монохромному дисплеях, ви повинні написати власну програму обслуговування монохромного дисплея. Чи ви можете з'ясувати, які значення треба змінити в полі даних BIOS, щоб курсор перейшов назад, і виконав потрібні дії, не ініціалізувавши адаптер щоразу.

Установка режиму

Коли програма виконує переривання INT 10H при AH = 0, вона викликає функцію установки режиму відеопрограми BIOS. Якщо в змінної EQUIP_FLAG відзначено, що в системі є монохромна плата, не важливо, яке значення виявилося в регістрі AL. У цьому випадку програма BIOS набудовує монохромний адаптер на режим 7, що означає текстовий режим 80*50, підтримуваний чорно-білою платою.

У випадку кольорової графічної плати значення в регістрі AL визначає, у який із двох графічних чи двох текстових режимів уведе програма BIOS дисплейний адаптер. Ви бачите, що існують чорно-білі режими поряд з кольоровими для тексту, а також графіка 320*200. Ці чорно-білі режими насправді не виключають кольору, вони тільки виключають сигнал кольоровості, що використовується в телевізорі для визначення кольору кожної крапки. Якщо ви використовуєте RGB-монітор, кольори залишаться на місцях. Якщо ж ви використовуєте кольоровий (чи чорно-білий) чи відеомонітор телевізор, установка чорно-білого режиму кольорової плати виключить кольори і дасть більш чітке зображення на екрані. Якщо ви займаєтеся задачею, у якій кольори не потрібні, то одержати трохи краще зображення можна, вибравши один з чорно-білих режимів замість кольорового.

Коли виконується програма установки режиму, вона настроює адаптер і поле даних відеопрограми BIOS на обслуговування потрібного режиму роботи. Програма установки режиму заповнює пробілами буфер дисплея і поміщає курсор у верхньому лівому куті екрана. Доти, поки ви не будете досить знайомі з пристроєм дисплея, ви повинні використовувати програму установки режиму BIOS. Хоча і немає нічого поганого в зміні кодів дисплея на ваші власні, дуже важко налагоджувати програму, що модифікує дисплей. Якщо ви зробите щось невірно, дисплей стане непрацездатним, і зникне можливість визначити, що ж невірно.

Функції відеопрограми, що відповідають номерам від 1 до 5 служать для роботи з регістрами мікросхеми 6845. Як ви пам’ятаєте з опису системної апаратури, мікросхема 6845 містить регістри, що керують формою і положенням курсору, а також тимчасовими характеристиками відображення. Ці підпрограми відеопрограми BIOS дозволяють модифікувати відображення, не знаючи базової адреси мікросхеми 6845. Ці підпрограми входять у число сервісних програм BIOS.

Зрушення зображення

Програми зрушення переміщають текстову інформацію або нагору, або вниз, у залежності від викликаної функції. Програми зрушення також забезпечують деякі засоби організації вікон (фрагментів екрана) на екрані дисплея - тобто BIOS може зрушувати тільки частина вмісту екрана. Вхідні параметри програми зрушення визначають прямокутник, розташований на екрані. Він задає верхній лівий і правий нижній кути області зрушення. Відеопрограма BIOS зрушує дані тільки в цій області. Інша частина екрана не міняється.

Ми вже бачили користь зрушення вікон при вивченні операційної системи і мови Бейсік, яке використовували для зрушення BIOS. Якщо працює 80-символьний дисплей, DOS установлює верхній лівий кут вікна зрушення рівним (0, 0), а нижній правий кут (24, 79). Так зрушується весь екран. Але Бейсік використовує двадцять п'ять рядків для індикації стану дисплея, і тільки 24 рядка відводить під зображення програми. Коли Бейсік зрушує екран за допомогою базової системи введення-висновку, він установлює верхній лівий кут у крапці (0, 0), а правий нижній кут - у крапці (23, 79). Із-за того, що останній рядок залишається за межами зрушення, вона не переміщається під час зрушення. У наступній главі приведений приклад зрушення вікна, який викликаний з програми на Бейсіку.

Відеопрограма BIOS виконує зрушення за допомогою переносу символів і атрибутів у дисплейному буфері. Програма зрушення не змінює стартової адреси дисплейного буфера; такий метод зрушення був би швидший, але не дозволяє прикладній програмі визначати, куди повинні потрапити окремі символи. Спосіб зрушення, реалізований у BIOS, підходить для звичайної роботи екрана. Помітимо також, що програма зрушує зображення при необхідності більш ніж на один рядок. Звичайно програма зрушує зображення на один рядок. Функція зрушення відеопрограми BIOS дозволяє зрушити вміст екрана на кілька рядків. Якщо ж кількість рядків зрушення дорівнює нулю, програма BIOS очищає екран. Це - швидкий спосіб очищення всього екрана або його частини.

Коли програма працює в 80-символьному режимі на кольоровому графічному адаптері, вона не може записувати або читати його текст у довільний момент часу. Якщо програма буде модифікувати буфер не в строго визначені моменти часу, на екрані з'являться перешкоди. Оскільки програма зрушення читає і записує великі кількості даних, вона повинна бути написана з урахуванням проблеми перешкод. Якщо подивитися текст програми обслуговування операції зрушення, то можна побачити, що BIOS обслуговує режим 80*25 кольорової плати (змінна CRT_MODE дорівнює 2 чи 3), як спеціальний випадок. У випадку операцій зрушення ця підпрограма BIOS чекає доти, поки не виникне вертикальний зворотний хід променя дисплея. Це означає, що апаратура адаптера видала на екран весь вміст буфера і готова почати новий кадр. (Апаратура адаптера повторює цей процес регенерації екрана 60 разів у секунду). З появою вертикального зворотнього ходу програма BIOS виключає дисплей і виконує зрушення. Коли програма зрушення перемістить усі символи, вона знову включає дисплей. Це викликає коротке миготіння дисплея. Якщо ви уважно подивитеся на екран під час зрушення, то побачте, що верхні його шість рядків трохи темніші інших. Це відбувається із-за того, що операція зрушення займає трохи більше часу, ніж один період регенерації екрана. Тому верхні шість рядків виключаються на два інтервали регенерації, а весь інший екран - тільки на один інтервал. Метод, що допускає появу перешкод на екрані, настільки непривабливий, що описаний метод переважніший. Ви можете написати кілька програм, щоб спробувати інші методи.