Переривання 10h

Переривання INT 10H забезпечує керування всім екраном. В регістрі AH встановлюється код, що визначає функцію переривання. Команда зберігає зміст регитрів BX, CX, DX, SI і BP. Нижче описані всі можливі функції.

AH=00: Установка режиму. Дана функція дозволяє периключати кольоровий монітор у текстовий чи графічний режим. Установка pежиму для виконуваної в сучасний момент програми здійснюється c допомогою INT 10H. При установці відбувається очищення екрану. Зміст регістру AL може бути наступним:

00 40 х 25 чорно-білий текстовий режим

01 40 х 25 стандартний 16-кольоровий текстовий режим

02 80 х 25 чорно-білий текстовий режим

03 80 х 25 стандартний 16-кольоровий текстовий режим

04 320 х 200 стандартний 4-кольоровий графічний режим

05 320 х 200 чорно-білий графічний режим

06 640 х 200 чорно-білий графічний режим

07 80 х 25 чорно-білий стандартний монохроматичний

08 - 0A формати для моделі PCjr

0D 320 х 200 16-кольоровий графічний режим (EGA)

0E 640 х 200 16- кольоровий графічний режим (EGA)

0F 640 х 350 чорно-білий графічний режим (EGA)

10 640 х 350 64- кольоровий графічний режим (EGA)

EGA (Enhanced Graphics Adapter) - позначає удосконалений графічний адаптер. Наступний приклад показує установку стандартного 16- кольорового текстового режиму

MOV AH,00 ;Функція установки режиму

MOV AL,03 ;Стандартний кольоровий текст 80 х 25

INT 10H ;Викликати BIOS

Для визначення типу адаптера, встановленого в системі, служить переривання BIOS INT 11H. Дана команда повертає в регістрі AX значення, в якому біти 5 і 4 вказують на відео режим:

01 40 х 25 чорно-білий режим у кольоровому адаптері

10 80 х 25 чорно-білий режим у кольоровому адаптері

11 80 х 25 чорно-білий режим у чорно-білому адаптері

Програма, що працює з невідомим типом монітора, може перевірити тип по регістру AX після INT 11H і потім встановити необхідний режим. AH=01: Установка розміру курсору. Курсор не є символом з набору ASCII-кодів. Комп'ютер має власне апаратне забезпечення для керування видом курсору. Для цього існує спеціальна обробка по INT перериванню. Звичайно символ курсоpа схожий на символ підкреслення. Використовуючи INT 10H, можна керувати вертикальним розміром курсору: біти 4-0 у регістрі CH для верхньої лінії сканування, а біти 4-0 у регістрі CL - для нижньої. Можна встановити будь-який pозмір курсору по вертикалі: від 0 до 13 для монохроматичних і EGA монітоpів і від 0 до 7 для більшості кольорових моніторів. Наведемо приклад для збільшення розміру курсору від його верхньої до нижньої лінії сканування:

MOV AH,01 ;Встановити розмір курсору

MOV CH,00 ;Верхня лінія сканування

MOV CL,13 ;Нижня лінія сканування

INT 10H ;Викликати BIOS

В результаті виконання цих команд курсор перетвориться в суцільний мигітливий прямокутник. Можна встановити будь-який розмір курсору між верхньою і нижньою границями, наприклад, 04/08, 03/10 і т.д. Курсор зберігає свій вигляд, поки програма не змінить його. Використання розмірів 12/13 (для моно) і 6/7 (для кольору) переводить курсор у його нормальний вигляд.

AH=02: Установка позиції курсору. Ця функція встановлює курcор у будь-яку позицію на екрані відповідно до координатами cтрічки і стовпця. Номер сторінки звичайно дорівнює 0, але може мати значення від 0 до 3 при 80 стовпцях на екрані. Для установки позиції курсору необхідно занести в регістр AH значення 02, у регістр BH номер сторінки і в регістр DX координати рядка і стовпця:

MOV AH,02 ;Встановити положення курсору

MOV BH,00 ;Сторінка 0

MOV DH,рядок ;Рядок

MOV DL,стовпець ;Стовпець

INT 10H ;Викликати BIOS

AH=03: Читання поточного положення курсору. Програма може визначити положення курсору на екрані (рядок і стовпець), а також pозмір курсору, у такий спосіб:

MOV AH,03 ;Визначити положення курсору

MOV BH,00 ;Встановити сторінку 0

INT 10H ;Викликати BIOS

Після повернення регістр DH буде містити номер рядка, а регістр DL-номер стовпця. У регістрі CH буде верхня лінія cканування, а в регістрі CL -нижня.

AH=04: Читання положення світлового пера. Дана функція використовується в графічному режимі для визначення положення світлового пеpа.

AH=05: Вибір активної сторінки. Нова сторінка встановлюється для кольорових текстових режимів від 0 до 3. Для режиму 40 х 25 можливо встановлювати до 8 сторінок (від 0 до 7), а для режиму 80 х 25 - до 4 сторінок (від 0 до 3).

MOV AH,05 ;Встановити активну сторінку

MOV AL,сторінка ;Номер сторінки

INT 10H ;Викликати BIOS

AH=06: Прокручування екрана нагору. Коли програма намагається видати текст на рядок нижче останнього на екрані, то відбувається перехід на верхній рядок. Навіть якщо за допомогою переривання буде створенний нульовий стовбець, все одно припускається новий рядок, і нижні рядки на екрані будуть зіпсовані. Для вирішення цієї проблеми використовується прокручування екрану.

Раніше код 06 використовувався для очищення екрану. В текстовому режимі установка в регістрі AL значення 00 призводить до повного прокручування нагору всього екрану, очищаючи його пробілами. Установка ненульового значення в регістрі AL визначає кількість рядків прокручування екрану нагору. Верхні рядки ідуть з екрану, а чисті рядки вводяться знизу. Наступні команди виконують прокручування всього екрану на один рядок:

MOV AX,0601H ;Прокрутити на один рядок нагору

MOV BH,07 ;Атрибут: нормальний, чорно-білий

MOV CX,0000 ;Координати від 00,00

MOV DX,184FH ;до 24,79 (повний екран)

INT 10H ;Викликати BIOS

Для прокручування будь-якої кількості рядків необхідно встановити відповідне значення в регістрі AL. Регістр BH містить атрибут для нормального чи інвертованого відображення, миготіння, установки кольору і т.д. Значення в регістрах CX і DX дозволяють прокручувати будь-яку частину екрану. Нижче наведений стандартний підхід до прокручування:

1. Визначити в елементі ROW (рядок) значення 0 для установки рядка положення курсору.

2. Видати текст і просунути курсор на наступний рядок.

3. Перевірити, чи знаходиться курсор на останньому рядку (CMP ROW,22).

4. Якщо так, то збільшити елемент ROW (INC ROW) і вийти.

5. Якщо ні, то прокрутити екран на один рядок і, використовуючи ROW перемістити курсор.

AH=07: Прокручування екрану вниз. Для текстового режиму прокручування екрану вниз позначає видалення нижніх рядків і вставка чистих рядків зверху. Регістр AH повинен містити 07, значення інших регістpів аналогічні функції 06 для прокручування нагору.

AH=08: Читання атрибуту/символу в поточній позиції курсору. Для читання символу і байта атрибута з дисплейного буфера, як у текстовому, так і в графічному режимі використовуються наступні команди:

MOV AH,08 ;Запит на читання атр./симв.

MOV BH,00 ;Сторінка 0 (для текстового реж.)

INT 10H ;Викликати BIOS

Дана функція повертає в регістрі AL значення символу, а у AH - його атрибут. У графічному режимі функція повертає тичина. 00 для не ASCII-кодів. Оскільки ця функція читає тільки один cимвол, то для символьного рядка необхідна організація циклу.

AH=09: Виведення атрибута/символу в поточну позицію курсору. Для висновку на екран символів у текстовому чи графічному режимі з установкою миготіння, інвертування і т.д. можна скористатися наступними командами:

MOV AH,09 ;Функція висновку

MOV AL,символ ;Виведений символ

MOV BH,сторінка ;Номер сторінки (текст.реж.)

MOV BL,атрибут ; чиАтрибут колір

MOV CX,повторення ;Число повторень символу

INT 10H ;Викликати BIOS

У регістр AL повинний бути поміщений виведений на екран символ. Значення в регістрі CX визначає число повторень символу на екрані. Виведення на екран послідовності різних символів вимагає організації циклу. Дана функція не переміщує курсор. У наступному прикладі на екран виводиться п'ять мигітливих "серденьок" в інвертованому вигляді:

MOV AH,09 ;Функція висновку

MOV AL,03H ;Хробаки (карткова масть)

MOV BH,00 ;Сторінка 0 (текст. режим)

MOV BL,0F0H ;Миготіння, інверсія

MOV CX,05 ;П'ять разів

INT 10H ;Викликати BIOS

В текстовому (але не в графічному) режимі символи автоматично виводяться на екран і переходять з одного рядка на інший. Для висновку на екран тексту чи запиту повідомлення необхідно скласти програму, що встановлює в регістрі CX значення 01 і в циклі завантажує в регістр AL з пам'яті виведені символи тексту. Оскільки регістр CX у даному випадку зайнятий, то не можна використовувати команду LOOP. Крім того, при висновку кожного символу необхідно додатково просувати курсор у наступний стовбець (функція 02).

В графічному режимі регістр BL використовується для визначення кольору графіки. Якщо біт 7 дорівнює 0, то заданий колір замінює поточний колір крапки, якщо біт 7 дорівнює 1, то відбувається комбінація кольорів за допомогою команди XOR.

AH=0A: Виведення символу в поточну позицію курсору. Єдина різниця між функціями 0A і 09 полягає в тому, що функція 0A не встановлює атрибут:

MOV AH,0AH ;Функція виведення

MOV AL,символ ;Виведений символ

MOV BH,сторінка ;Номер сторінки (для тексту)

MOV CX,повторення ;Число повторень символу

INT 10H ;Викликати BIOS

Для більшості застосувань команда переривання DOS INT 21H більш зручна.

AH=0E: Виведення у режимі телетайпа. Дана функція дозволяє використовувати монітор, як простий термінал. Для виконання цієї функції необхідно встановити в регістрі AH тичину значення 0E, у pегістр AL помістити виведений символ, колір тексту (у графічному режимі) занести в регістр BL і номер сторінки для текстового режиму - у регістр BH. Звуковий сигнал (код 07H), повернення на одну позицію (08H), кінець рядка (0AH) і повернення каретки (0DH) діють, як команди для форматування екрану. Дана функція автоматично просуває курсор, переводить символи на наступну cтрічку, виконують прокручування екрану і зберігає поточні атрибути екрану.

AH=0F: Одержання поточного відео режиму. Дана функція повертає в регістрі AL поточний відео режим (див.функцію AH=00), в pегістрі AH - число символів в рядку (20, 40 чи 80), у регістрі BH - номер сторінки.

AH=13: Встановлення символьного рядка (тільки для AT). Дана функція дозволяє на комп'ютерах типу AT виводити на екран символьні рядки з установкою атрибутів і переміщенням курсору:

MOV AH,13H ;Функція висновку на екран

MOV AL,сервіс ;0, 1, 2 чи 3

MOV BH,сторінка ;

LEA BP,адреса ;Адреса рядка в ES:BP

MOV CX,довжина ;Довжина рядка

MOV DX,екран ;Координати на екрані

INT 10H ;Викликати BIOS

Можливий наступний додатковий сервіс:

0 - використовувати атрибут і не переміщати курсор;

1 - використовувати атрибут і перемістити курсор;

2 - вивести символ, потім атрибут і не переміщати курсор;

3 - вивести символ, потім атрибут і перемістити курсор.

2. Функції екранного режиму. Функції малювання крапки та прямої

ГРАФІЧНИЙ РЕЖИМ

Для генерації кольорових зображень у графічному режимі використовують- ся мінімальні крапки растра - пікселі (pixel). Кольоровий графічний адаптер (CGA) має три ступені дозволу:

1. Низький дозвіл (не підтримується в ROM) забезпечує встановлення 100 рядків по 160 крапок (тобто чотири біти на крапку). Кожна крапка може мати один з 16 стандартних квітів, як описано в попередньому розділі "Кольору". Реалізація даного режиму включає пряму адресацію контролера Motorola 6845 CRT. Для цього використовуються два порти: тичина.3D4 і 3D5.

2. Середній дозвіл для стандартної кольорової графіки забезпечує 200 рядків по 320 крапок. Кожен байт у цьому випадку представляє чотири крапки (тобто два біти на крапку).

3. Високий дозвіл забезпечує 200 рядків по 640 крапок. Оскільки в даному випадку потрібно 16ДО байт пам'яті, високий дозвіл досягається тільки в чорно-білому (BW) режимі. Кожен байт тут представляє 8 крапок (т.е. один біт на крапку). Нульове значення біта дає чорний колір крапки, одиничне - білий.

Помітимо, що в графічному режимі ROM містить крапкові вигляди тільки для перших 128 ASCII-кодів. Команда INT 1FH забезпечує доступ до 1ДО байтової області в пам'яті, визначальної інші 128 символів. (8 байт на символ). Відображення графічних байтів у відео сигнали аналогічно, як для середнього, так і для високого pазрешения.

РЕЖИМ СЕРЕДНЬОГО ДОЗВОЛУ

При середньому дозволі кожен байт представляє чотири крапки, пронумерованих від 0 до 3:

Байт: :C1 C0:C1 C0:C1 C0:C1 C0:

Піксели: 0 1 2 3

У будь-який момент для кожної крапки можливі чотири кольори, від 0 до 3. Обмеження в 4 кольори підрозумівається тим, що двобітова крапка має 4 комбінації значень бітів: 00, 01, 10 і 11. Можна вибpати значення 00 для кожного з 16 можливих квітів чи фону вибрати значення 01, 10, і 11 для однієї з двох палітр. Кожна палітpа має три кольори:

C1 C0 Палітра 0 Палітра 1

0 0 фон фон

0 1 зелений голубий

1 0 червоний бузковий

1 1 коричневий білий

Для вибору кольору палітри і фону використовується INT 10H. Таким чином, якщо, наприклад, обраний фон жовтого кольору і палітра 0, то можливі наступні кольори крапки: жовтий, зелений, червоний і коричневий. Байт, що містить значення 10101010, відповідає червоним крапкам. Якщо вибрати колір фону - синій і палітру 1, то можливі кольори: синій, блакитний, бузковий і білий. Байт, що містить значення 00011011, відображає синю, блакитну, бузкову і білу крапки. Переривання BIOS INT 10H для графіка Функція AH=00 команди INT 10H встановлює графічний режим. Функція AH=11 команди INT 10H дозволяє вибрати колір палітри і вивести на екран графічний символ. Код у регіст- рі AH визначає функцію: AH=00: Установка режиму. Нульове значення в регістрі AH і 04 у pегістрі AL установлюють стандартний кольоровий графічний режим:

MOV AH,00 ;Функція установки режиму

MOV AL,04 ;Дозвіл 320х200

INT 10H

Установка графічного режиму приводить до зникнення курсору з екрана. Подробиці по установці режиму приведені у главі 9.

AH=0BH: Установка колірної палітри. Число в регістрі BH визначає призначення регістра BL: BH=00 вибирає колір фону і бордюру відповідно до змісту pегістра BL. Колір фону від 1 до 16 відповідає тичина значенням oт 0 до F;

BH=01 вибирає палітру відповідно вмісту регістра BL (0 чи 1):

MOV AH,0BH ;Функція установки кольору

MOV BH,01 ;Вибір палітри

MOV BL,00 ; 0 (зелений, червоний, корич.)

INT 10H ;Викликати BIOS

Палітра, встановлена один раз, зберігається, поки не буде скасована іншою командою. При зміні палітри весь екран змінює колірну комбінацію. При використанні функції AH=0BH у текстовому режимі, значення, установлене для кольору 0 у палітрі, визначає колір бордюру.

AH=0CH: Виведення крапки на екран. Використання коду 0C у регістрі AH дозволяє вивести на екран крапку в обраному кольорі (фон і палітра). Наприклад, для дозволу 320х200 завантажимо в регістр DX вертикальну координату (від 0 до 199), а в регістр CX - горизонтальну координату (від 0 до 319). У регістр AL помістимо колір крапки (від 0 до 3):

MOV AH,0CH ;Функція висновку крапки

MOV AL,колір ;Колір крапки

MOV CX,стовпець ;Горизонтальна координата

MOV DX,рядок ;Вертикалькая координата

INT 10H ;Викликати BIOS

AH=0DH: Читання крапки з екрана. Дана функція дозволяє прочитати крапку для визначення її кольору. У регістр DX повинна бути завантажена вертикальна координата (від 0 до 199), а в регістр CX - горизонтальна (від 0 до 319). У регістрі AH повинне бути значення 0D. Функція повертає колір крапки в регістрі AL.

Лекція 11

1. Поняття "середовища години виконання програми" та "системні змінні"

2. PSP та отримання доступу до командної стрічки

3. Доступ до системних змінних з програми

1. Поняття "середовища години виконання програми" та "системні змінні"

Середовищем години виконання називається адресний проміжок, у який завантажується сама програма, адресний проміжок, який виділяється їй для динамічних змінних, а також набір та значення системних змінних.

Системною змінною називається такий спеціальний іменований параметр, який існує в операційній системі протягом її роботи, і який задає певне значення, критичне для її роботи, або роботи якоїсь програми.

2. PSP та отримання доступу до командної стрічки

Префікс програмного сегмента (PSP) займає 256 (тичина 100) байт і завжди передує в пам'яті кожної COM- чи EXE-програмі, що повинна бути виконана. PSP містить наступні поля:

00 Команда INT 20H (тичина.CD20).

02 Загальний розмір доступної пам'яті у форматі хххх0. Наприклад, 512K вказується як 8000 замість 80000.

04 Зарезервовано.

05 Довгий виклик диспетчера функцій DOS.

OA Адреса підпрограми завершення.

OE Адреса підпрограми реакції на Ctrl/Break.

12 Адреса підпрограми реакції на фатальну помилку.

16 Зарезервовано.

2C Сегментна адреса середовища для збереження ASCIIZ рядків.

50 Виклик функцій DOS (INT 21H і RETF).

5C Параметрична область 1, форматована як стандартний невідкритий блок керування файлів (FCB№1).

6C Параметрична область 2, форматована як стандартний невідкритий блок керування файлім (FCB№2); перекривається, якщо блок FCB№1 відкритий.

80-FF Буфер передачі даних (DTA).

Буфер передачі даних DTA

Дана частина PSP починається за адресою тичина.80 і являє собою буферну область уведення-висновку для поточного дисковода. Вона містить у першому байті число, що вказує скільки разів були натиснуті клавіші на клавіатурі безпосередньо після введення імені програми. Починаючи з другого байта, знаходяться введені символи (якщо такі існують). Далі випливає всіляке "сміття", що залишилося в пам'яті після роботи попередньої програми. Наступні приклади демонструють призначення буфера DTA:

Приклад 1. Команда без операндів. Припустимо, що ви визвали програму CALCIT.EXE для виконання за допомогою команди CALCIT [return]. Після того, як DOS побудує PSP для цієї програми, він установить у буфері за адресою тичина.80 значення тичина.000D. Перший байт містить число символів, уведених із клавіатури після імені CALCIT, крім символу "повернення каретки". Оскільки крім клавіші Return не було натиснуто ні однієї, то число символів дорівнює нулю. Другий байт містить символ повернення каретки, тичина.0D. Таким чином, по адресах тичина.80 і 81 на ходятся 000D.

Приклад 2. Команда з текстовим операндом. Припустимо, що після команди був зазначений текст (але не ім'я файлу), наприклад, COLOR BY, що позначає виклик програми COLOR і передачу цій програмі параметра "BY" для установки блакитного кольору на жовтому фоні. У цьому випадку, починаючи з адреси тичина.80, DOS установить наступні значення байтів:

80:03 20 42 59 0D

Ці байти позначають довжину 3, пробіл, "BY" і повернення каретки.

Приклад 3. Команда з ім'ям файлу в операнде. Програми типу DEL (видалення файлу) припускають після імені програми введення імені файлу як параметр. Якщо буде введено, наприклад, DEL B:CALCIT.OBJ [return], то PSP, починаючи з адрес тичина.5C і тичина.80, буде містити:

5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A

C A L C I T O B J

80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D B : C A L C I T . 0 B J

Починаючи з адреси 5C, знаходиться невідкритий блок FCB, що містить ім'я файлу, що був зазначений у параметрі, CALCIT.OBJ, але не ім'я виконуваної програми. Перший символ вказує номер дисковода (02=B у даному випадку). Слідом за CALCIT знаходяться два пробіли, що доповнюють ім'я файлу до восьми символів, і тип файлу, OBJ. Якщо ввести два параметри, наприклад:

progname A:FILEA,B:FILEB

тоді DOS побудує FCB для FILEA по зсуві тичина 5C і FCB для FILEB по зсуві тичина.6C. Починаючи з адреси 80 у цьому випадку міститься число введених символів (довжина параметрів) - 16, пробіл (тичина.20) A:FILEA,B:FILEB і символ повернення каретки (OD).

Оскільки PSP безпосередньо передує вашій програмі, то можливий доступ до області PSP для обробки зазначених чи файлів або для виконання визначених дій. Для локалізації буфера DTA COM-програма може просто помістити тичину.80 у регістр SI і одержати доступ у такий спосіб:

MOV SI,80H;Адреса DTA

CMP BYTE PTR [SI],0;У буфері нуль?

JE EXIT

Для EXE-програми не можна з упевненістю затверджувати, що кодовий сегмент безпосередньо розташовується після PSP. Однак, тут при ініціалізації регістри DS і ES містять адреса PSP, так що можна зберегти вміст регістра ES після завантаження регістра DS:

MOV AX,DSEG

MOV DS,AX

MOV SAVEPSP,ES

Пізніше можна використовувати збережена адреса для доступу до буфера PSP:

MOV SI,SAVEPSP

CMP BYTE PTR [SI+ 80H],0;У буфері нуль?

JE EXIT

DOS версії 3.0 і страше містить команду INT 62H, завантажую щую в регістр BX адреса поточного PSP, якому можна использо вать для доступу до даних у PSP.

3. Доступ до системних змінних з програми

Спеціалізованої функції для доступу до змінних середовища не існує. Однак, аналізуючи слово в PSP під адресою 2c (вказівник на сегмент з копією стану середовища), можна вийти на масив системних змінних, і таким чином дістати потрібну змінну.

Кожна з системних змінних зберігається у вигляді стрічки, що закінчується нулем, саме так, як їх було визначено в config.sys чи autoexec.bat. Використовуючи мнемоніку асемблера, можемо написати так:

db ‘PATH=C:\Windows’,0

db ‘PROMPT=$p$g’,0

Використовуючи вже відомі команди для роботи з ланцюжками, можна легко виділити імена та значення системних змінних, і використати їх у роботі.

Лекція 12

Системні змінні BIOS та робота з ними за допомогою прямих посилань

Відеопрограма BIOS керує роботою двох дисплейних адаптерів, що можуть бути встановлені в IBM PC. Ми залишили її для розгляду в останню чергу, тому що вона найбільша і складна з усіх програм, що входять у базову систему введення висновку.

Поля дані відеопрограми

Секція поля даних BIOS, має заголовок VIDEO DISPLAY DATA AREA і починається із зсуву 49H, містить змінну, яка використовується відеопрограмою. Усі ці осередки даних містять значення, які використовуються для роботи з дисплейним адаптером у даний момент часу. Багато хто з цих значень копіюють дані, що знаходяться в регістрах дисплейних адаптерів, з яких заборонене читання. Відеопрограма BIOS повинна знати поточне значення таких змінних, як CRT_MODE_SET і CRT_PALETTE при модифікаці регістра. На відміну від порту висновку на системній платі (порт 61H), BIOS не може прочитати ці регістри перед їхньою зміною. Це означає, що BIOS повинен підтримувати в пам'яті образ регістра.

Усі поля даних мають змістовні коментарі, що пояснюють призначення даних під час вашої роботи з текстом BIOS. Окремого коментаря заслуговує поле CURSOR_POSN. Оскільки кольоровий графічний адаптер може підтримувати більше однієї сторінки зображення в текстовому режимі, тому на кожній сторінці існує своє місце для курсору. Контролер CRT 6845 обслуговує тільки курсор поточної сторінки. Коли BIOS переключається зі сторінки на сторінку, контролер запам'ятовує положення курсора на відповідній сторінці. Оскільки кольорова плата може містити максимум вісім сторінок у 40-символьному режимі, тому існує вісім осередків для збереження поточного положення курсору на кожній сторінці.

Функції відеопрограми

Програма дисплея BIOS має багато функцій. У зв'язку з тим, що відеопрограма має так багато функцій, вона використовує таблицю переходів до цих функцій. Ця таблиця названа M1 і містить зсув кожної крапки входу програми дисплея BIOS. Перша частина програми VIDEO_IO витягає код з регістра AH і перетворить його на адресу переходу. Перша частина програми виконує ще і деякі інші дії, включаючи перевірку поля EQUIP_FLAG.

Фірма 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, щоб курсор перейшов назад, і виконав потрібні дії, не ініціалізувавши адаптер щоразу.

Наши рекомендации