Программирование видеоадаптеров.© Александр Фролов, Григорий ФроловТом 21, М.: Диалог-МИФИ, 1993. Запись символа с атрибутами в текущей позиции курсора - функция 09hФункция позволяет записать один или несколько одинаковых символов в текущей позиции курсора. Запись может происходить как в активную, так и в неактивные страницы видеопамяти. После выполнения операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы. Данная функция работает как в текстовых, так и в графических режимах.
Если бит 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 |