Программирование видеоадаптеров CGA, EGA и VGA

       

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


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

На входе: AH = 09h - запись символа с атрибутом;

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

BH = номер страницы видеопамяти;

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

CX = число записываемых символов.

На выходе: Не используются.

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

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

TITLE BIOS_FUNCTION

.MODEL tiny

DOSSEG

.STACK 100h

.DATA message DB "INT 10h", 0 video_page DB 2

.CODE .STARTUP

; выбираем режим 0 видеоадаптера



xor ah,ah xor al,al int 10h

; изменяем форму курсора

mov ah,1

; начало курсора - линия 0 ; конец курсора - линия 7

mov ch,0 mov cl,7 int 10h

; выбираем страницу видеопамяти - video_page

mov ah,5 mov al,video_page int 10h

; прокручиваем окно экрана

mov ah,6 xor al,al ; прокручиваем все окно mov bh,0FFh ; используем атрибут 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 ; если конец строки достигнут, то оканчиваем процедуру mov bl,8 ; для отображаемых символов используем атрибут 8 mov cx,1 ; символы строки выводятся без повтора int 10h

; перемещаем курсор в следующую позицию строки

mov ah,2 inc dl int 10h

jmp next_char

exit_proc:

ret

WriteString ENDP

END



Содержание раздела