В этой теме расскажу о том, как производится вывод на экран в текстовом режиме 80x25, в дальнейшем, возможно рассмотрю также графические режимы и работу с таблицами знакогенератора.
Видеопамять проецируется в оперативную, поэтому обращение к ней осуществляется также с помощью адресации. Сегментный адрес текстовой видеопамяти B800. В данном режиме работы видеоадаптер поддерживает 8 видеостраниц, адреса видеостраниц в текстовом режиме 80х25:
Страница 0 - B800:0000 Страница 1 - B800:1000
Страница 2 - B800:2000 Страница 3 - B800:3000
Страница 4 - B800:3000 Страница 5 - B800:5000
Страница 6 - B800:4000 Страница 7 - B800:7000
Исключение составляют видеоадаптеры EGA, которые имеют 64КБ видеопамяти, в этом случае поддерживается 4 видеостраницы. Одна из видеостраниц является активной, то есть содержимое области памяти активной страницы мы видим на экране. К каждой странице видеоэкрана можно обратиться с помощью функций BIOS, с помощью адресации, а также с помощью управляющих регистров контроллера ЭЛТ.
Для кодирования каждого знакоместа (символа) экрана используется 2 байта, первый байт - ASCII код символа, а второй байт - атрибут символа. Атрибуты определяют цвет символа, цвет фона, интенсивность цвета. Приведу формат байта атрибута:
D2-D0 Цвет символа.
D3 Интенсивность символа.
D6-D4 Цвет фона символа.
D7 Мигание символа или интенсивность фона символа.
Код цвета в__________Стандартный цвет________Цвет с повышенной
байте атрибутов______________________________интенсивностью
000__________________черный__________________серый
001__________________синий___________________светло-синий
010__________________зеленый_________________светло-зеленый
011__________________морской волны___________голубой
100__________________красный_________________светло-красный
101__________________фиолетовый______________малиновый
110__________________коричневый______________желтый
111__________________белый___________________ярко-белый
Давайте выведем на экран всю таблицу ASCII символами в цвете морской волны на коричневом фоне:
Код: Выделить всё
.model tiny
.286
code segment
org 100h
start:
;get text videomemory address in ES:BX
push 0B800h
pop es
mov cx, 256d ;size of ASCII table
mov ah, 01100011b ;attribute
display:
mov word ptr es:[bx], ax
add bx, 2d
inc al
loop display
mov ah, 1d
int 21h
push 0
ret
code ends
end start
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22!
Спасибо за внимание!
С уважением, push0ret!