Текстовый режим установлен по умолчанию. В текстовом режиме содержимое экрана отображается в памяти ЭВМ, начиная с адреса B8000h. Каждой позиции на экране соответствует два байта в памяти, как это показано на рисунке 6.2. Первый из них, младший байт, содержит код символа. Во втором записаны атрибуты позиции.
Атрибуты позиции содержат цвет символа, отображенного в данной позиции, и цвет фона в этой позиции. Атрибуты состоят из разрядов:
bl |
r |
g |
b |
I |
R |
G |
B |
где IRGB – код цвета символа, описанный в предыдущем параграфе, а rgb – код цвета фона. Бит bl, установленный в 1, означает мигание символа, записанного в этой позиции (не во всех текстовых режимах). Позиции (x, y) на экране соответствует два байта по адресу B8000h + 160y +2x.
Очистка экрана и прокрутка экрана вверх. При попытке вывести текст в строке ниже последней происходит продвижение всех строк вверх. Это продвижение называется прокруткой или скроллингом экрана. Прокрутку экрана вверх можно выполнить с помощью команд.
mov ax,0601h ;функция 6
mov bh,07 ;атрибуты новой строки
mov cx,0 ;левый верхний угол
mov dh,24 ;координаты правого
mov dl,79 ;нижнего угла
int 10h
Число строк, на которое выполняется прокрутка, устанавливается в регистре AL. В данном случае оно равно1. В общем случае можно выполнить прокрутку произвольного окна. Входные данные для функции прокрутки следующие:
AH — 06h – прокрутка вверх,
AL — число строк для прокрутки,
BH — атрибут для очищаемых строк,
(CH, CL) — координаты (y, x) левого верхнего угла окна,
(DH, DL) — координаты (y, x) правого нижнего угла окна.
С помощью функции прокрутки можно очищать экран. Для этого его надо прокрутить вверх на число строк на экране, установив al = 0:
mov ax,0600h
mov bh,07 ;белые символы на черном фоне
mov cx,0 ;левый верхний угол (0, 0)
mov dh,24 ;координаты правого
mov dl,79 ;нижнего угла
int 10h
Пример. С клавиатуры вводятся символы. Напишем программу, отображающую эти символы в средней строке экрана с миганием. Выход из программы – ввод символа Ctrl/C. Символы будем вводить с помощью функции ввода с клавиатуры без отображения на экран. Выводить на экран символы будем с помощью записи в видеопамять, предварительно записав в байты атрибутов признак «вывод символа с миганием».
< 1 > title usymb.exe
< 2 > code segment
< 3 > assume cs:code
< 4 > main:
< 5 > call clrscr ;очистка экрана
< 6 > mov ax,0B800h ;установить es
< 7 > mov es,ax ;на видеопамять
< 8 > mov di,12*160 ;смещение начала средней линии
< 9 > next:
< 10 > call kbinne ;ввод символа без эха
< 11 > mov es:[di],al ;вывод символа
< 12 > add di,2
< 13 > jmp next
< 14 > ;подпрограммы————
< 15 > clrscr proc
< 16 > mov ax,0600h ;очистка экрана
mov bh,10000111b ;атрибут
< 1 >
< 2 > mov cx,0
< 3 > mov dh,24
< 4 > mov dl,79
< 5 > int 10h
< 6 > ret
< 7 > clrscr endp
< 8 >
< 9 > kbinne proc
< 10 > mov ah,8 ;ввод символа без
< 11 > int 21h ;эхо — отображения
< 12 > ret
< 13 > kbinne endp
< 14 > code ends
< 15 > end main