Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
4
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

3.1.2. Засобу bios

Функції DOS виводу на екран дозволяють перенаправляти вивід у файл, але не дозволяють вивести текст у будь-яку позицію екрана і не дозволяють змінити колір тексту. DOS припускає, що для більш тонкої роботи з екраном програми повинні використовуватися відеофункції BIOS. BIOS (базова система введення-виводу) — це набір програм, розташованих у постійній пам'яті комп'ютера, що виконують його завантаження відразу після включення і забезпечують доступ до деяких пристроїв, зокрема до відеоадаптера. Усі функції відеосервісу BIOS викликаються через переривання 10h. Розглянемо функції, що можуть бути корисні для виводу текстів на екран.

Вибір відеорежиму

BIOS надає можливість переключення екрана в різні текстові і графічні режими. Режими відрізняються друг від друга дозволом (для графічних) і кількістю рядків і стовпців (для текстових), а також кількістю можливих квітів.

INT 10h, АН = 00 — Установити відеорежим

Уведення:

AL = номер режиму в молодших 7 бітах

Вивід:

Звичайно ніякого, але деякі BIOS (Phoenix і AMI) поміщають у AL 30Н для текстових режимів і 20h для графічних

Виклик цієї функції приводить до того, що екран переводиться в обраний режим. Якщо старший біт AL не встановлений у 1, екран очищається. Номера текстових режимів — 0, 1, 2, 3 і 7.0 і 1 — 16-кольорові режими 40x25 (з 25 рядками по 40 символів у рядку), 2 і 3 — 16-кольорові режими 80x25, 7 — монохромний режим 80x25. Ми не будемо поки розглядати графічні режими, хоча функції виводу тексту на екран DOS і BIOS можуть працювати й у них. Існує ще багато текстових режимів з більш високим дозволом (80x43, 80x60, 132x50 і т. д.), але їхнього номера для виклику через цю функцію різні для різних відеоадаптерів (наприклад, режим 61h — 132x50 для Cirrus 5320 і 132x29 для Genoa 6400). Однак, якщо відеоадаптер підтримує стандарт VESA BIOS Extention, у режими з високим дозволом можна переключатися, використовуючи функцію 4Fh.

INT 10h, АН = 4Fh, AL = 02 — Установити SuperVGA-видеорежим

Уведення:

ВХ = номер режиму в молодших 13 бітах

Вивід:

AL = 4Fh, якщо ця функція підтримується

АН = 0, якщо переключення відбулося успішно

АН = 1, якщо відбулася помилка

Якщо біт 15 регістра ВХ встановлений у 1, відеопам'ять не очищається. Текстові режими, які можна викликати з використанням цієї функції: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch).

Відеорежим, використовуваний у DOS за замовчуванням, — текстовий режим 3.

Управління положенням курсору

INT 10h, АН = 02 — Установити положення курсору

Уведення:

АН = 02

ВН = номер сторінки

DH = рядок

DL = стовпець

За допомогою цієї функції можна установити курсор у будь-яку позицію екрана, і подальший вивід тексту буде походити з цієї позиції. Відлік номера рядка і стовпця ведеться від верхнього лівого кута екрана (символ у лівій верхній позиції має координати 0, 0). Номера сторінок 0 – 3 (для режимів 2 і 3)і 0 – 7 (для режимів 1 і 2) відповідають області пам'яті, уміст якої в даний момент відображається на екрані. Можна вивести текст у неактивну в даний момент сторінку, а потім переключитися на неї, щоб зображення змінилося миттєво.

INТ 10h, АН = 03 — Вважати положення і розмір курсору

Уведення:

АН = 03

ВН = номер сторінки

Вивід:

DH, DL = рядок і стовпець поточної позиції курсору

СН, CL = перший і останній рядки курсору

Повертає поточний стан курсору на обраній сторінці (кожна сторінка використовує власний незалежний курсор).

Вивід символів на екран

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

Атрибут символу:

Біт 7: символ мигає (за замовчуванням) або тло яскравого кольору (якщо його дія була перевизначена відеофункцією 10h).

Біти 6 – 4: колір тла.

Біт 3: символ яскравого кольору (за замовчуванням) або тло мигає (якщо його дія була перевизначена відеофункцією 11h).

Біти 2 – 0: колір символу.

Кольори кодуються в бітах, як показано в таблиці 1.

Таблиця 1. Атрибути символів

 

Звичайний колір

Яскравий колір

000b

чорний

темно-сірий

001b

синій

ясно-синій

010b

зелений

ясно-зелений

011b

голубой

світло-блакитний

100b

червоний

ясно-червоний

101b

пурпурний

світло-пурпурний

110b

коричневий

жовтий

111b

ясно-сірий

білий

INT 10h, АН = 08 — Вважати символ і атрибут символу в поточній позиції курсору

Уведення:

АН = 08

ВН = номер сторінки

Вивід:

АН = атрибут символу

AL = ASCII-код символу

INT 10h, АН = 09 — Вивести символ із заданим атрибутом на екран

Уведення:

АН = 09

ВН = номер сторінки

AL = ASCII-код символу

BL = атрибут символу

СХ = число повторень символу

За допомогою цієї функції можна вивести на екран будь-який символ, включаючи навіть символи CR і LF, що звичайно інтерпретуються як кінець рядка. У графічних режимах СХ не повинний перевищувати число позицій, що залишилося до правого краю екрана.

INT 10h, АН = 0Ah — Вивести символ з поточним атрибутом на екран

Уведення:

АН = 0Ah

ВН = номер сторінки

AL = ASCII-код символу

СХ = число повторень символу

Ця функція також виводить будь-як символ на екран, але як атрибут символу використовується атрибут, що мав символ, що знаходився раніше в цій позиції.

INT 10h, АН = 0Eh — Вивести символ у режимі телетайпа

Уведення:

АН = 0Eh

ВН = номер сторінки

AL = ASCII-код символу

Символи CR (0Dh), LF (0Ah), BEL (7) інтерпретуються як керуючі символи. Якщо текст при записі виходить за межі нижнього рядка, екран прокручивается нагору. Як атрибут використовується атрибут символу, що знаходився в цій позиції.

INT 10h, AH = 13h — Вивести рядок символів із заданими атрибутами

Уведення:

АН = 13h

AL = режим виводу:

біт 0 — перемістити курсор у кінець рядка після виводу

бітів 1 — рядок містить не тільки символи, але також і атрибути, так що кожен символ описується двома байтами: ASCII-код і атрибут

біти 2 – 7 зарезервовані

СХ = довжина рядка (тільки число символів)

BL = атрибут, якщо рядок містить тільки символи

DH, DL = рядок і стовпець, починаючи з яких буде виводитися рядка

ES: BP = адреса початку рядка в пам'яті

Функція 13h виводить на екран рядок символів, інтерпретуючи керуючі символи CR (0Dh), LF (0Ah), BS (08) і BEL (07). Якщо рядок підготовлений у форматі символ, атрибут — набагато швидше просто скопіювати неї у відеопам'ять, про що розказане в наступному розділі.

Скористаємося тепер функціями BIOS, щоб удосконалити програму DOSOUT1 і вивести на екран усі 256 символів, включаючи навіть символи перекладу рядка. Крім того, для кращої читаності таблиці після кожного символу буде виводитися пробіл.

Приклад 2

; biosout. asm

; Виводить на екран усі ASCII-символи без винятку

org 100h ; Початок Сома-файлу

use16

start:

mov ax,0003h

int 10h ; Відеорежим 3 (очищення екрана

; і установлення курсору в 0, 0)

mov dx,0 ; DH і DL будуть використовуватися

; для збереження положення курсору.

; Початкове положення - 0,0

mov si,256 ; SI буде лічильником циклу

mov al,0 ; Перший символ - з кодом 00h

mov ah,9 ; Номер відеофункції “вивід символу з атрибутом”

mov cx,1 ; Виводиться один символ за раз

mov bl,00011111b

; атрибут символу - білий на синьому

cloop:

int 10h ; Вивести символ на екран

push ax ; Зберегти поточний символ і номер функції

mov ah,2 ; Номер відеофункції 2 -

; змінити положення курсору

inc dl ; Збільшити поточний стовпець на 1

int 10h ; Перемістити курсор

mov ax,0920h; АН = 09, AL = 20h (ASCII-код пробілу)

int 10h ; Вивести пробіл

mov ah,2 ; Номер відеофункції 2

inc dl ; Збільшити стовпець на 1

int 10h ; Перемістити курсор

pop ax ; Відновити номер функції в ah

; і поточний символ у al

inc al ; Збільшити AL на 1 - наступний символ

test al,0Fh ; Якщо AL не кратний 16,

jnz continue_loop

; продовжити цикл,

push ax ; інакше - зберегти номер функції

; і поточний символ

mov ah,2 ; Номер відеофункції 2

inc dh ; Збільшити номер рядка на 1

mov dl,0 ; Стовпець = 0

int 10h ; Установити курсор на початок наступного рядка

pop ax ; Відновити номер відеофункції

; і поточний символ

continue_loop:

dec si ; Зменшити SI на 1,

; якщо він не став нулем - продовжити

jnz cloop ; CX використовується усередині циклу,

; так що не можна використовувати команду LOOP

; для його організації

ret ; Завершення Сома-файлу

Тому що функція 09 виводить символ у позиції курсору, але не переміщає сам курсор, це приходиться робити щораз спеціально.

Функції BIOS зручні для переключення і настроювання відеорежимів, але часто виявляється, що вивід тексту на екран набагато швидше і простіше виконувати просто копіюванням зображення у відеопам'ять.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]