В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
Приложение В. Проверочные задания, основные сведения и примеры программ
Текстовый режим дисплея. Управление сдвигами отображаемых данных
7.1. Формулировка задания
Разработать программу на ассемблере, которая в общем случае
выполняет следующие функции:
- вывод текстовых данных на экран,
- вертикальный и горизонтальный сдвиг текста,
- сдвиг экранных страниц,
- переключение между станицами.
7.2. Основные сведения
Как
известно, видеоадаптеры выполняют текстовые и графические режимы. При включении
питания устанавливается текстовый режим с форматом 80х25. В текстовом режиме
каждый байт символа сопровождается соответствующим байтом атрибутов, задающим
сведения о цвете символа, фона и интенсивности свечения. Символ размещается в
видеопамяти в байте с четным адресом, а атрибут – в байте с нечетным адресом.
На рис. 1 показано кодирование байта атрибута.
Рис.1.
Формат байта атрибутов
Различают стандартные коды атрибутов цветного и монохромного
режимов (табл. 1 и 2).
Основными цветами являются: красный (R), зеленый (G) и синий
(B). Комбинации этих цветов позволяют получить восемь основных цветов. С учетом
степени яркости формируют 16 цветов.
В формате байта атрибута биты R, G и B указывают на номер
одной из 16 6- битовых палитр контроллера атрибутов, в которых по умолчанию
устанавливаются стандартные цвета. Эти цвета в адаптере EGA можно изменить и
выбрать любой из 64 цветов. В адаптере VGA 6-битовое значение регистра палитры,
дополненное до 8 битов, кроме того, выбирает один из 256 18-битовых регистров
цвета ЦАП. Поэтому представленные в табл.1 типовые цвета образуются, когда в
этих регистрах хранятся стандартные значения. Содержимое каждого 18-битового
кода регистра цвета ЦАП состоит из трех 6-битовых значений R, G и B цветов, что
позволяет получить 262144 комбинации произвольных цветов. Рассмотрим
использование видеопамяти в текстовом режиме для адаптера VGA.
Таблица 1
Цветной атрибут
|
Код
|
Изображение
|
Код
|
Изображение
|
0
|
Черный
|
8
|
Серый
|
1
|
Синий
|
9
|
Яркий синий
|
2
|
Зеленый
|
10
|
Яркий зеленый
|
3
|
Голубой
|
11
|
Яркий голубой
|
4
|
Красный
|
12
|
Яркий красный
|
5
|
Пурпурный
|
13
|
Яркий вишневый
|
6
|
Коричневый
|
14
|
Яркий желтый
|
7
|
Белый
|
15
|
Яркий белый
|
Таблица 2
Монохромный атрибут
|
Код
|
Изображение
|
Код
|
Изображение
|
0
|
Нет изображения
|
112
|
Негативное изображение
|
1
|
Подчеркивание
|
129
|
Мигание с подчеркиванием
|
7
|
Обычный
|
135
|
Обычное изображение с миганием
|
9
|
Яркий с подчеркиванием
|
137
|
Мигание с повышенной яркостью
|
15
|
Повышенная яркость
|
140
|
Негативное изображение с миганием
|
Напомним, что видеопамять содержит четыре банка (двоичные
плоскости), причем нулевой банк хранит байты символов, первый банк – байты
атрибутов, а второй банк – таблицы определений символов знакогенератора.
Доступом к видеопамяти управляет контроллер ЭЛТ, позволяющий линейно отображать
содержимое банка 0 на экран дисплея с учетом байтов атрибутов, размещенных в
банке 1.
Различные режимы используют соответствующие адресные области
памяти. В табл.3 представлены режимы видеоадаптера VGA и их начальные адреса.
Таблица 3
Режим
|
Начальный адрес
|
0,1,2,3,4,5,6
|
B8000
|
7
|
В0000
|
D,E,F,10,11,12,13
|
A0000
|
В видеопамяти байты хранятся в виде цепочки, а при выводе на
экран они автоматически разворачиваются в виде последовательных символьных
строк, в знаковой позиции каждой из которых может быть размещен матричный образ
символа. Местоположение символа на экране определяется по следующей формуле:
Смещение = (номер строки х 80 +
номер столбца) х 2.
В этой формуле смещение берется относительно начала
видеопамяти для текстового режима с форматом 80х25 и множитель 2 отмечает
наличие байта символа и его байта атрибута.
Функции 08 – 0Ah прерывания int10h BIOS предназначены для записи или чтения
символов. Чтобы считать символ и атрибут в позиции курсора (функция 08h),
предварительно задается положение курсора с помощью функции 02h BIOS. Функция
08h возвращает в регистр AH атрибут и в регистр AL символ в соответствии с
координатами курсора на заданной странице. Функция 09h осуществляет запись
символа и атрибута в позицию курсора заданное число раз. При записи одного
символа в регистре CX следует установить 1. Функция 0Ah выполняет запись только
символа в позицию курсора.
Часть видеопамяти, выводимой на экран, образует страницу.
Например, для режима с форматом 80х25 требуется 4000 байтов в странице.
Понятно, что в видеопамяти может храниться несколько экранных страниц в
зависимости от режима. Так, например, для адаптера VGA в режимах 0 и 1 число
байтов в странице равно 2000 байтов, в режимах 2, 3 и 7 – 4000 байтов, в
режимах 4, 5 и 6 – 16000 байтов и т.д.
В каждый момент времени только одна дисплейная страница
является активной, а видеоадаптер может выполнять быстрое переключение страниц.
Начало выводимой на экран области видеопамяти определяют по
содержимому переменной в области данных BIOS по адресу 0040:004Eh и регистров
R12 и R13 контроллера ЭЛТ, управляющих страницами дисплея. Иногда в оперативной
памяти образуют псевдостраницы, из которых потом быстро передают данные в
соответствующие экранные страницы видеопамяти. Граничные (стартовые) адреса
страниц для видеопамяти, имеющей начальный адрес B800, и режима с форматом
80х25, следующие: страница 0 – смещение 0000h, страница 1 – смещение 0800h,
страница 2 – смещение 1000h и т.д. Чтобы задать соответствующую страницу,
необходимо в регистры R12 (старший байт) и R13 (младший байт) контроллера ЭЛТ
записать одно из указанных выше смещений.
Рассмотрим вертикальные сдвиги текстового экрана (скроллинг
(прокрутку) окна вверх и вниз). При скроллинге вверх на одну строку и вниз
экрана появляется новая строка. Аналогичным образом выполняется скроллинг окна
вниз. В текстовом режиме с форматом 80х25 для сдвига экрана на одну строку
вверх необходимо в видеопамяти переместить вверх содержимое текущей страницы на
160 байт (80 символов х 2) с учетом байтов атрибутов. Увеличение адреса
видеопамяти приводит к сдвигу изображения экрана вверх, а уменьшение адреса – к
сдвигу изображения вниз. Сдвиг текстовых данных можно выполнить двумя
способами: программным и аппаратным. Программный способ связан с
непосредственным переносом символов и атрибутов в видеопамяти. Аппаратный
способ является более быстродействующим и заключается в использовании регистров
R12 и R13 контроллера ЭЛТ видеоадаптера. Если увеличить содержимое регистров
R12 и R13 на 80, то это будет соответствовать сдвигу изображения экрана на одну
строку вверх, т.е. изображение будет начинаться не с нулевой строки, а уже с
первой строки. Значение стартового адреса в регистрах R12 и R13 не учитывает
байты атрибутов – это следует иметь ввиду при написании программы. Таким
образом, при аппаратном сдвиге данные не перемещаются в видеопамяти, а только
указывается ее начальный адрес, начиная с которого данные выводятся на экран.
Функции 06h и 07h прерывания int10h BIOS применяются для
выполнения соответственно скроллинга вверх и вниз. Для выполнения этих функций
необходимо задать параметры, определяющие прямоугольник (окно) экрана,
информация которого сдвигается на заданное число строк. Эти параметры указывают
на верхний левый угол и нижний правый угол окна стандартным способом: текстовые
строка и столбец верхнего левого угла и текстовые строка и столбец нижнего
правого угла. Для очищаемых строк задается атрибут пробелов заполнения.
Если число строк сдвига равно 0, то область скроллинга
очищается. Процедура прокрутки BIOS использует программный способ сдвига
данных.
Горизонтальные сдвиги влево и вправо выполняются только путем
перемещения символов и атрибутов в видеопамяти. Для сдвига экрана влево на 3
столбца необходимо переставить содержимое страницы видеопамяти на 6 байтов с
учетом байтов атрибутов в сторону уменьшения адресов видеопамяти (вниз). При
выполнении первого сдвига символ столбца 0 и строки 1 перемещается на строку 0
и столбец 79 и т.д. После выполнения этой процедуры необходимо очистить правые
три колонки, заполнив их пробелами, или с помощью функции вертикального сдвига
int10h. Аналогичным способом выполняется сдвиг экрана вправо путем перемещения
его содержимого вверх (в сторону увеличения адресов видеопамяти).
7.3. Пример выполнения задания
При выполнении программы на экран выдается указанное в
области данных сообщение, и после нажатия любой клавиши экран заполняется
фоновой окраской, определяемой кодом ASCII 176. После этого на экране
изображается диагональ символов. Нажатие клавиши управления курсором вызывает
перемещение диагонали по экрану. Очистка экрана и выход в DOS выполняется
нажатием клавиши ESC. Листинг программы представлен в COM-формате и содержит процедуры
изображения диагонали по новым и старым координатам, установки невидимого и
видимого курсора, записи символа в позицию курсора и обслуживания клавиатуры.
Code Segment 'Code'
org 100h
assume cs:Code,ds:Code,es:Code
Begin: jmp Start
Message db ''
db ' Проверочное
задание №7', 13,10
db ' "Текстовый
режим дисплея. '
db ' Управление
сдвигами',13,10
db ' отображаемых
данных"',13,10
db '',13,10
db ' Представление
диагонали символов на экране.'
db 13,10,' Прямая
запись символов в видеопамять.'
db 13,10,' Сдвиг
диагонали символов клавишами'
db 'управления курсора.',13,10,'',13,10
db ' Выход
из программы по нажатию клавиши "ESC"'
db 13,10,' Для
продолжения работы программы'
db ' следует
нажать любую клавишу',13,10,13,10,'$'
NewX db 0 ; Новая координата X
NewY db 0 ; Новая координата Y
OldX db 0 ; Старая координата
X
OldY db 0 ; Старая коодината
Y
;-------------------------Процедура считывания кода нажатой
клавиши------------------
;--------------------Возвращает в AX: Scan и ASCII-код
нажатой клавиши-------------
ReadKey Proc Near
xor ax,ax
int 16h
ret
REadKey EndP
;-------------------------Процедура установки видимого
курсора--------------------------
ShowCursor Proc Near
mov ah,1
mov cx,0708h
int 10h
ret
ShowCursor EndP
;------------------------Процедура установки невидимого
курсора------------------------
HideCursor Proc Near
mov ah,1
mov cx,20h
int 10h
ret
HideCursor EndP
;-----------------Процедура записи в видепамять символа и его
цвета------------------
;-------------аналогична функции 09h видео-BIOS без установки
страницы----------
;--------------------------------------Входные
параметры:--------------------------------------
;-----------------------DH-столбец DL-строка CX-число
повторений---------------------
;----------------------------------AH-цвет AL-код символа----------------------------------
PutCharAttr Proc Near
push es
push cx
push bx
push dx
push ax
mov ax,0B800h
mov es,ax ;
Устанавливаем сегмент видеопамяти
xor ax,ax
mov bx,160 ;
Заносим в BX множитель
push dx ;
Сохраняем координаты
mov al,dl ;
Заносим в AL координату Y
xor dx,dx
mul bx ;
Умножаем Y на 160
pop dx
mov bl,dh ;
Заносим в BL координату X
shl bl,1 ;
Умножаем X на 2
add ax,bx ;
Складывем и получаем указатель в буфере
mov bx,ax
pop ax
Cycle: jcxz EndClk ; Если
счетчик циклов равен 0,то выходим
mov word ptr es:[bx],ax ; Записываем
символ по смещению
add bx,2 ;
Переходим к следующему символу
dec cx ;
Уменьшаем счетчик символов
jmp Cycle ;
Повторяем цикл
EndClk:pop dx
pop bx
pop cx
pop es
ret
PutCharAttr EndP
;----------Процедура записи в видеопамять диагонали по новым
координатам------
OldDraw Proc Near
mov dh,byte ptr OldX ;
Устанавливаем старые координаты
mov dl,byte ptr OldY
mov ah,70h ;
Устанавливаем цвет символа
mov al,176 ;
Устанавливаем код символа
call Draw ;
Вызываем процедуру отображения
; диагонали
ret
OldDraw EndP
;------------Процедура записи в видеопамять диагонали фоновых
символов---------
NewDraw Proc Near
mov dh,byte ptr NewX ; Устанавливаем
новые координаты
mov dl,byte ptr NewY
mov ah,70h ;
Устанавливаем сегмент видеопамяти
mov al,41h ;
Устанавливаем код символа
call Draw ;
Вызываем процедуру отображения
; диагонали
mov byte ptr OldX,dh ; Запоминаем
новые координаты
mov byte ptr OldY,dl
ret
NewDraw EndP
;-------------------Процедура записи в видеопамять диагонали
символов--------------
;---------------------------------------Входные
параметры:-------------------------------------
;--------------------------------------DH-столбец
DL-строка-----------------------------------
;------------------------------------AH-цвет AL-код
символа----------------------------------
Draw Proc Near
push dx ;
Сохраняем координаты
mov cx,20 ;
Устанавливаем счетчик цикла 1-го уровня
L0: push cx ;
Сохраняем текущее положение счетчика
mov cx,4 ;
Устанавливаем счетчик цикла 2-го уровня
L3: push cx ;
Сохраняем текущее положение счетчика
mov cx,1 ;
Устанавливаем число повторений
cmp dh,80 ;
Если X за пределами экрана, то не
; отображаем
jae LE1
cmp dl,25 ;
Если X за пределами экрана, то не
; отображаем
jae LE1
call PutCharAttr ;
Отображаем символ в видеопамять
LE1: pop cx ;
Восстанавливаем счетчик цикла 2-го уровня
dec cx
inc dh
jcxz L4 ;
Проверка на конец цикла
jmp L3
L4: pop cx ;
Восстанавливаем счетчик цикла 1-го уровня
dec cx
inc dl
jcxz L1
jmp L0 ;
Проверка на конец цикла
L1: pop dx
ret
Draw EndP
;----------------------------------------Основная
программа------------------------------------
Start: lea dx,Message ; Выводим
начальное сообщение
mov ax,0900h
int 21h
call ReadKey
call HideCursor
mov ax,70B0h ;
Устанавливаем цвет и символ заполнения
xor dx,dx ;
Устанавливаем координаты начала экрана
; (0,0)
mov cx,2000 ;
Количество повторений - на весь экран
call PutCharAttr
Clk: call NewDraw
call ReadKey ;
Ждем нажатия
клавиши
Right: cmp ax,4D00h ; Проверка на
нажатие клавиши "Вправо"
jne Left
cmp NewX,79
je Clk
inc NewX ; Перемещаем вправо на
1 символ
jmp Cnt
Left: cmp ax,4B00h ; Проверка на
нажатие клавиши "Влево"
jne Up
cmp NewX,0
je Clk
dec NewX ; Перемещаем влево на 1
символ
jmp Cnt
Up: cmp ax,4800h ; Проверка
на нажатие клавиши "Вверх"
jne Down
cmp NewY,0
je Clk
dec NewY ; Перемещаем вверх на 1
символ
jmp Cnt
Down: cmp ax,5000h ; Проверка на
нажатие клавиши "Вниз"
jne Escape
cmp NewY,24
je Clk
inc NewY ; Перемещаем вниз на 1
символ
jmp Cnt
Escape:cmp ax,011Bh
je Quit
Cnt: call OldDraw
jmp Clk
;-----------------------------------------------Выход----------------------------------------------
Quit: xor dx,dx
mov ax,0720h
mov cx,2000h
call PutCharAttr
call ShowCursor
mov ax,4c00h
int 21h
Code Ends
End Begin
7.4. Варианты заданий
На рис. 2 показан морфологический
граф вариантов заданий.
Рис.2. Морфологический граф вариантов
заданий
Вариант задания определяется маршрутом в графе, например,
1-4-8-12-15-18. Без учета вершин 5 и 10 морфологический граф устанавливает 288
заданий. Вершина 1 указывает на ввод символов с помощью клавиатуры, а вершина 2
– на наличие символов в программе. Необходимо использовать разные атрибуты, заданные
в таблице. Уровень способа записи символов содержит: вершину 3, соответствующую
записи символа по курсору; вершину 4 – записи символа непосредственно в
видеопамять и вершину 5 – записи символа по псевдокурсору. Вершина 6 определяет
размещение символов в виде первой диагонали, вершина 7 – второй диагонали,
вершина 8 – строки символов, вершина 9 – столбца символов, а вершина 10 –
собственного изображения. Вершины 5 и 10 соответствуют творческому заданию.
Уровень управления сдвигами состоит из двух вершин 11 и 12. Вершина 11
назначает параметрический способ управления сдвигами так, как это выполняется,
например, для функции 6 прерывания int10h BIOS, т.е. указываются координаты
области сдвига. Вершина 12 соответствует управлению сдвигами с помощью клавиш курсора.
Уровень направления вертикального сдвига содержит: вершину 13 (сдвиг вверх),
вершину 14 (сдвиг вниз) и вершину 15 (сдвиг вверх и вниз).
Аналогичным образом определяются вершины уровня направления
горизонтального сдвига: вершина 16 соответствует сдвигу влево, вершина 17 –
сдвигу вправо и вершина 18 – сдвигам влево и вправо. Программа должна быть
выполнена на низком уровне (ассемблере). К творческим вариантам задания можно
также отнести организацию сдвига только части изображения (левой, центральной
или правой), переключение текстовых страниц с регулировкой скорости их
появления и изменение цвета выводимых на экран символов.
Похожие материалы:
Текстовый режим
Театрально-зрелищные предприятия: Раздел ЕТКС
Тарифы на услуги в области гражданской авиации и
сборы за данные услуги, правила продажи перевозочных документов
Телефонные разговоры осужденных к лишению
свободы
Темперировщик жировой основы (Выпуск №51 ЕТКС )
Темы
докладов и рефератов
|