Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
138
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

Свертка текстового окна вниз - функция 07h

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

На входе:

AH

07h - свертка окна вниз

AL

Число свертываемых линий, если оно равно нулю, то окно прокручивается целиком

BH

Атрибут, используемый для строк, возникающих в верхней части окна

CH

Номер строки левого верхнего угла окна

CL

Номер столбца левого верхнего угла окна

DH

Номер строки правого нижнего угла окна

DL

Номер столбца правого нижнего угла окна

На выходе:

Не используются

Функция работает аналогично функции 06h (за исключением направления свертки).

Чтение символа и его атрибутов - функция 08h

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

На входе:

AH

08h

BH

Номер страницы видеопамяти

На выходе:

AL

ASCII-код символа

AH

Байт атрибутов символа для текстовых режимов

Следующий пример считывает символ и его атрибут из текущей позиции курсора на странице page:

mov ah,8 mov bh,page ; Выбираем страницу видеопамяти page int 10h ; Считываем символ и его атрибут mov char,al ; Сохраняем полученный ASCII-код символа mov attr,ah ; и его атрибут

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

В качестве таблицы определения символов графического режима используется таблица, на которую указывает вектор прерывания 43h. Для графических режимов низкого разрешения (режимы номер 4, 5, 6) используется таблица символов, на которую указывает вектор прерывания 1Fh. Эта таблица содержит определение символов с ASCII-кодами 80h - FFh.

Запись символа с атрибутами в текущей позиции курсора - функция 09h

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

На входе:

AH

09h

AL

ASCII-код записываемого символа

BH

Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

BL

Атрибут символов (для текстового режима) или цвет пикселов символа (для графического режима);

CX

Количество записываемых символов

На выходе:

Не используются

Если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ. Естественно, за исключением режима номер 13h, в котором все биты регистра BL используются для задания цвета пикселов символа.

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

Листинг 5.1. Файл BIOSFUN.ASM

TITLE BIOS_FUNCTION .MODEL small DOSSEG .STACK 100h .DATA message DB "INT 10h", 0 video_page DB 2 .CODE .STARTUP ; Выбираем режим 3 видеоадаптера xor ah,ah mov al,3 int 10h ; Изменяем форму курсора mov ah,1 mov ch,0 ; начало курсора - линия 0 mov cl,7 ; конец курсора - линия 7 int 10h ; Выбираем активную страницу видеопамяти mov ah,5 mov al,video_page ; выбираем страницу video_page int 10h mov ah,6 mov al,0 mov bh,0ffh mov cl,10 mov ch,5 mov dl,30 mov dh,15 int 10h ; Устанавливаем координаты курсора mov ah,2 mov bh,video_page ; выбираем страницу video_page mov dh,12 ; строка 12 mov dl,20 ; колонка 20 int 10h ; Отображаем на активной странице экрана строку message mov si,OFFSET message call WriteString .EXIT 0 ; Процедура WriteString выводит на экран строку, имеющую ; смещение si в сегменте ds WriteString PROC ; Определяем текущую активную страницу экрана mov ah,0Fh int 10h ; номер активной страницы в регистре bh ; Получаем в dx координаты курсора mov ah,3 int 10h ; В цикле выводим на экран символы строки next_char: mov ah,9 lodsb cmp al,0 ; находим конец строки ; Если достигнут конец строки оканчиваем процедуру je exit_proc ; Для отображаемых символов используем атрибут 7 ; символы строки выводятся без повтора mov bl,7 ; mov cx,1 ; int 10h ; Перемещаем курсор в следующую позицию строки mov ah,2 inc dl int 10h jmp next_char exit_proc: ret WriteString ENDP END