|
Задание
1. Организовать вывод на экран “бегущей” текстовой строки.
2. Изменить цвет текста.
Представление текстовых данных
Во всех видеоподсистемах компьютеров IВМРС и РS/2 для хранения в видеобуфере текстовой информации применяется одинаковый формат. В этом формате каждый символ представляется простой структурой из двух байтов (рис. 1). Символы хранятся в буфере в линейной последовательности, соответственно отображаясь на экране слева направо и сверху вниз
Младший байт Старший байт
АSCII-код Атрибут
Рис..2. Карта видеобуфера в текстовых режимах 80х25
Аппаратный знакогенератор преобразует код каждого символа в соответствующий точечный набор на экране. Схема декодера атрибутов синхронно генерирует соответствующий данному символу - цвет, яркость, мерцание и т. д. Поскольку каждому коду символа в видеобуфере соответствует байт атрибута, экранными атрибутами каждого знака можно управлять независимо. Аппаратный знакогенератор отображает каждый текстовый символ в пределах прямоугольной матрицы из пикселов. В этой матрице символ составляется из пикселов основного цвета (или пикселов переднего плана). Цвет основных и фоновых пикселов символа определяется младшей и старшей тетрадами соответствующего байта атрибута. Для вывода символа следует записать его АSCII-код и атрибут в соответствующее место •видеобуфера. Благодаря линейному отображению можно легко найти адрес (относительно начала 'буфера) конкретного знакоместа экрана. Общая формула выглядит следующим образом
смещение = (строка * ширина + столбец) *2.
В этой формуле ширина есть число символов в каждой строке. Коэффициент 2 введен потому, что символ занимает 2 байта (одно 16-битовое слово) видеобуфера. Значения строки и столбца нумеруются относительно 0, начиная с левого верхнего угла экрана. (Символ в верхнем левом углу расположен в строке 0, колонке 0). Если проверить содержимое видеобуфера, можно увидеть соответствие между видеобуфером и экраном
Несмотря на то что во всех видеоподсистемах компьютеров семейств 1ВМ РС и РS/2 применяется один и тот же способ представления текстовых символов, способы интерпретации байтов атрибута различны. В общем, байт атрибута рассматривается как две тетрады. Младшая тетрада (биты 0 — 3) определяет основной атрибут переднего плана, т. е. цвет и яркость самого знака. Старшая тетрада (биты 4 — 7) представляет собой атрибут фона, хотя в некоторых случаях бит 7 может управлять мерцанием.
Четырехбитовые основные и фоновые атрибуты в конечном счете декодируются в сигналы управления видеомонитором. В простейшем случае у адаптера СGА 4 бита соответствуют непосредственно трем цветовым сигналам и яркостному сигналу В других видеоподсистемах схема декодирования может быть и более сложной, как, например, в ЕGА.
Адаптер ЕGА
В 16-цветных текстовых режимах ЕСА использует формат байта атрибута, идентичный этому формату для СGА. Однако 4-битовые значения основного и фонового атрибутов непосредственно отображаемым цветам не соответствуют. Вместо этого каждое 4-битовое значение маскируется четырьмя младшими битами регистра разрешения цветовой плоскости (12Н) контроллера атрибутов, а 4-битовый результат указывает на один из шестнадцати регистров палитры EGA (рис. 5). Каждый бит 6-битового значения цвета, содержащегося в указанном регистре палитры, соответствует одному из 6 RGB-сигналов, управляющих монитором (рис. 6).
ЕGА-совместимый цветной монитор управляется шестью цветовыми сигналами — тремя основными (высокой интенсивности) и тремя дополнительными (низкой интенсивности). Все 64 комбинации этих шести сигналов появляются как различные цвета с различной или одинаковой интенсивностью. В 200-строчном цветном мониторе или в 200-строчном режиме ЕGA-совместимого монитора биты 0, 1 и 2 управляют цветовыми сигналами, а бит 4 — сигналом интенсивности.
Метод косвенного генерирования цвета через регистры палитры более сложен, нежели прямой метод адаптера CGA, но оказывается более гибким. Можно выбирать основные и фоновые цвета Рис. 6. Значения регистра палитры EGA и соответствующие цветовые сигналы для монитора. Номера контактов даются для 9-штырькового разъема адаптера EQA
Как в адаптерах CGA и MDA, старший бит каждого байта атрибута управляет мерцанием или интенсивностью цвета фона. Бит 3 регистра управления режимом контроллера атрибутов EGA (регистр 10H адресуется с помощью порта ЗС0Н) является битом разрешения мерцания. Установка.его в единицу разрешает мерцание, поэтому регистр палитры определяет только три младших бита тетрады фона (биты 4 — 6 байта атрибута). Таким образом, когда разрешено мерцание, для выбора цвета фона можно обращаться только к первым восьми регистрам палитры. Сброс бита разрешения мерцания запрещает мерцание, обеспечивая доступ ко всем 16 регистрам палитры
Когда с помощью BIOS адаптера EGA выбирается текстовый режим, в регистры палитры по умолчанию записываются соответствующие цветам CGA значения. Значения цветов во вторых восьми регистрах палитры являются яркими вариантами первых восьми. Таким образом, если рассматривать бит 7 байта атрибута символа как бит "интенсивности фона или мерцания", программа будет выполняться с адаптерами EGA и CGA.
Изменять содержимое любого регистра палитры можно как непосредственно, так и при помощи функции 10H прерывания INT 10H (листинг 3). Использовать процедуру BIOS более удобно, так как при этом устраняется необходимость написания аппаратно-зависимых программ. После того, если задана таблица значений соответствующих цветов, процедура BIOS может загрузить одновременно все 16 регистров палитры Тем не менее иногда, например в мультипликации, для быстрой смены цветов на экране может потребоваться непосредственное программирование регистров палитры.
Листинг программы
CSEG segment
org 100h
begin:
mov ax,dx
mov es,ax
;cls
mov al, 02h
mov ah, 00h
int 10h
mov bx, 0;spaces counter
main:
;get ticks count
MOV AH, 00H
INT 1AH
ADD DX, 3;delay=3/18
MOV WAIT_TIME,DX
TIMER:
MOV AH, 00H
INT 1AH
CMP DX,WAIT_TIME;if time is came - exit
JB TIMER
;output to videobufer
mov ax, 0B800h;videobuffer addres->es
mov es,ax
mov di,0h;
mov cx,len
add cx, bx
mov si, 0;char counter
;set color
mov ax, bx;
mov dx, 15
div dl
mov al, 0;
inc ah;
cycle:
;if need spaces
cmp cx, len
ja space;
;char to write
mov al, byte ptr string [si]
jmp output;
space:
;space output
mov al, 32;space code
mov es:[di],ax
add di,2
jmp endloop
output:
;char output
mov es:[di],ax
add di,2
inc si;next string char
endloop:
loop cycle;end char cycle
inc bx;inc space counter
cmp bx, 65
jb main;if moved 65 times - exit
mov ax,4C00h
int 21h
WAIT_TIME dw 100
string db 'Hello World'
len=$-string
CSEG ends
end begin
Дата добавления: 2015-08-10; просмотров: 38 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Тема: Сохранение исторической памяти, русского языка. | | | Результат выполнения программы |