Программирование видеоадаптеров

       

Запись символа с атрибутами в текущей позиции курсора - функция 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


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