В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
Приложение В. Проверочные задания, основные сведения и примеры программ
Графические режимы дисплея
8.1. Формулировка задания
Разработанная программа на ассемблере должна выполнять
следующие функции:
-
установки
заданного графического режима;
-
представления на
экране требуемого графического изображения с соответствующими цветами;
-
управления полным
или частичным вертикальным и горизонтальным сдвигами изображения.
8.2. Основные сведения
В графическом режиме видеопамять хранит двоичный образ,
соответствующий пикселному изображению на экране. Причем каждый пиксел на
экране представлен одним или несколькими битами видеопамяти, определяющими цвет
пиксела (число одновременно наблюдаемых цветов). Графические режимы адаптеры
VGA представлены в табл. 1.
Таблица 1
Номер режима
|
Разрешающая способность
|
Начальный адрес видеопамяти
|
Первичные цвета
|
Формат текста
|
Размер матрицы символа
|
4,5
|
320*220
|
B8000
|
4
|
40*25
|
8*8
|
6
|
640*220
|
B8000
|
2
|
80*25
|
8*8
|
D
|
320*200
|
A0000
|
16
|
40*25
|
8*8
|
E
|
640*200
|
A0000
|
16
|
80*25
|
8*8
|
F
|
640*350
|
A0000
|
Моно
|
80*25
|
8*14
|
10
|
640*350
|
A0000
|
16
|
80*25
|
8*14
|
11
|
640*480
|
A0000
|
2
|
80*30
|
8*16
|
12
|
640*480
|
A0000
|
16
|
80*30
|
8*16
|
13
|
320*200
|
A0000
|
256
|
40*25
|
8*8
|
Наиболее употребительным является 16-цветный графический режим
№12, а режим №13 позволяет получить большее число оттенков цветов (256). В этих
режимах каждый пиксел на экране соответственно использует 4 бита или 8 бит
видеопамяти.
Двоичный образ изображения видеопамяти линейно отображается
на экран монитора, т.е. экранную страницу видеопамяти можно представить в виде
матрицы с прямоугольной системой координат, причем начальный адрес страницы
соответствует левому верхнему углу экрана. Позиция пиксела на экране также
определяется координатами (х,у), где х-столбец, а у-строка развертки. Координатам
(х,у) пиксела соответствует смещение адреса видеопамяти и смещения в адресуемом
байте данных видеопамяти, т.к. каждый байт видеопамяти для, например,
16-цветного режима хранит значения 8 пикселов, а строка развертки состоит из 80
байтов. Исключение составляет 256-цветный режим, в котором каждый байт
видеопамяти хранит значение одного пиксела.
Таким образом, по координатам (х,у) можно вычислить смещение,
определяющее расположение видеопамяти битового значения соответствующего
пиксела.
Формирование цвета пиксела на экране монитора (кроме режима
13) в адаптере VGA выполняется по следующей схеме:
Видеопамять -> регистры политры ->
регистры ЦАП-экран.
В режиме 13 байт пиксела непосредственно используется в
качестве индекса для выбора соответствующего 18-битного регистра ЦАП с помощью
регистра маски ЦАП.
Вывод текста в графических режимах выполняется так же, как и
в текстовых режимах, использующие необходимые общие процедуры BIOS. Но в отличие от текстовых
режимов изображение символов графических режимов осуществляется программным
способом как будто бы это графический рисунок.
Рассмотрим преобразование координат пиксела в соответствующий
адрес размещения его битового значения в видеопамяти (рис. 1).
Рис. 1. Формат графического экрана
Положение пиксела на экране определяется прямоугольными
координатами (X,Y), где X – горизонтальная позиция пиксела (номер столбца), а Y
– вертикальная позиция пиксела (номер строки), взятые соответственно, например,
из диапазонов 0-639 и 0-349 (рис. 1).
В графическом режиме начальный адрес 7-го бита первого байта
страницы видеопамяти соответствует пикселу (точке), размещенному в левом углу
экрана. Таким образом, каждому пикселу соответствует бит в битовой плоскости
видеопамяти (кроме графического режима 13h). Позиция этого бита определяется
размещением его в байте и смещением этого байта относительно начального адреса
страницы видеопамяти. В 16-цветных режимах Е, 10 и 12 каждый байт содержит
значение 8-ми пикселов, а каждая строка – 80 байтов. Для этих режимов адреса
(смещения) байта, содержащего пиксел с координатами (X,Y), определяется с
помощью следующего выражения:
,
а номер
необходимого бита в байте равен 7-(X % 8), где знак % указывает на
использование и int – определение наибольшего целого числа, не превосходящего
заданное числовое значение. Кроме того, для расчета масок бита в байте может
быть применена формула
1shl((X and 7) xor 7),
где X и Y -
координаты пиксела, взятые соответственно из диапазонов 0-639 и 0-349. Этот
принцип преобразования координат экрана с целью нахождения адреса бита пиксела
в видеопамяти сохраняется и для других графических режимов, кроме режима 13h, в
котором каждый байт видеопамяти соответствует значению одного пиксела. В этом
случае задача упрощается и необходимо только определить смещение этого байта
относительно адреса страницы видеопамяти.
Более подробно основные сведения графического режима изложены
в главе 9.
8.3. Пример выполнения варианта задания
Задание:
Вывести на экран фигуру « D
» и обеспечить ее передвижение по экрану, управляя клавишами курсора ß->áâ.
Выполнение:
В области данных программы заданы координаты выводимой
фигуры.
Используется графический режим 10h (640 х 350, EGA/VGA 4
битовых плоскости).
Используемые регистры графического контролера:
- индексный регистр (порт 3CEh);
- режим чтения/записи (порт 3CFh (индекс 5));
- регистр битовой маски (порт 3CFh (индекс 8));
- регистр блока синхронизации;
- индексный регистр (порт 3C4h);
- регистр маски карты цвета (порт 3C5h (индекс 2)).
Алгоритм записи:
1. Установить маску цвета.
2. Прочитать байт из видеопамяти (ВП).
3. Установить маску битов.
4. Запись (режим 0) байта в видеопамять (0 – стереть pixel,
FFh – установить pixel).
Формула для расчета смещения байта в видеопамяти: .
Формула для расчета маски бита: 1shl((X and 7) xor 7).
Программа:
stack segment stack
db 128 dup(?)
stack ends
data segment
baseX dw
250
newbaseX dw
250
baseY dw
100
newbaseY dw
100
len equ
50
deltaX equ
5
deltaY equ
5
data ends
code segment
assume
cs:code, ds:data, ss:_stack
jmp start
;-------------------------------------------установка
пиксела на экран-------------------------------------
setpixel proc ;вычислим
смещение байта от начала ВП Y*80+int(x/8)
mov bx,80
mov ax,di
mul bx
mov bx,si
shr bx,1
shr bx,1
shr bx,1
add bx,ax
mov al,es:[bx] ;чтение байта из
ВП, установим регистр маски битов
mov dx,3ceh ;адресный
регистр контроллера
mov al,8 ;регистр
битовой маски (БМ)
out dx,al ;установка
адресуемого регистра
inc dx ;регистр
данных
;------------------------вычислим маску
бита в байте 1 shl ((x and 7) xor 7)-----------------------
mov ax,1
push cx
mov cx,si
and cx,7
xor cx,7
shl ax,cl
pop cx
out dx,al ;запись
маски в регистр БМ
ret
setpixel endp
;-----------------------------------------вывод
фигуры на экран--------------------------------------------
drawfigure proc ;установим
маску цвета
mov dx,3c4h ;адресный
регистр секвенсера
mov al,2 ;регистр
маски цвета
out dx,al
inc dx ;регистр
данных
mov al,0fh ;все
биты
out dx,al
;---------------------------------------------вывод
левой ветви----------------------------------------------
mov si,newbaseX
mov
di,newbaseY
mov
cx,len/15*10
m1: call setpixel
mov byte
ptr es:[bx],0ffh ;запись в ВП
dec si
inc di
loop m1
;------------------------------------------вывод
правой ветви---------------------------------------------
mov si,newbaseX
mov di,newbaseY
mov
cx,len/15*10
m2: call setpixel
mov byte
ptr es:[bx],0ffh
inc si
inc di
loop m2
;-----------------------------------------------вывод
нижней ветви------------------------------------------
mov si,newbaseX
mov di,newbaseY
sub
si,30
add
di,30
mov
cx,15/10*len+11
m3: call setpixel
mov byte
ptr es:[bx],0ffh
inc si
loop m3
ret
drawfigure endp
;-------------------------------------------стирание
фигуры с экрана--------------------------------------
clearfigure proc ;установим
маску цвета
mov dx,3c4h ;адресный
регистр секвенсера
mov al,2 ;регистр
маски цвета
out dx,al
inc dx ;регистр
данных
mov al,0fh ;все
биты
out dx,al
;----------------------------------------------вывод
левой ветви----------------------------------------------
mov si,baseX
mov di,baseY
mov cx,len/15*10
m4: call setpixel
mov byte ptr es:[bx],0 ;запись в ВП
dec si
inc di
loop m4
;----------------------------------------------вывод
правой ветви--------------------------------------------
mov si,baseX
mov di,baseY
mov
cx,len/15*10
m5: call
setpixel
mov byte
ptr es:[bx],0
inc si
inc di
loop m5
;-----------------------------------------------вывод
нижней ветви------------------------------------------
mov si,baseX
mov di,baseY
mov cx,15/10*len
m6: call setpixel
mov byte
ptr es:[bx],0
inc si
loop m6
ret
clearfigure endp
;-----------------------------------------------работа с клавиатурой-----------------------------------------
getevent proc
push bx
push dx
mov dx,newbaseX
mov
bx,newbaseY
l1: mov ah,0ch
mov al,8
int 21h
cmp al,27
jne l2
pop dx
pop bx
jmp exit
l2: cmp al,0
jne l1
mov ah,8
int 21h
cmp
al,72 ;стрелка вверх
je l3
jmp l4
l3: sub
bx,deltaY
cmp bx,0
jl l31
jmp l10
l31: mov bx,0
jmp l10
l4: cmp al,80 ;стрелка вниз
je l5
jmp l6
l5: add bx,deltaY+len
cmp bx,349
jg l51
sub bx,len
jmp l10
l51: mov bx,349-len
jmp l10
l6: cmp al,75 ;стрелка влево
je l7
jmp l8
l7: sub dx,deltaX+len
cmp dx,0
jl l71
add dx,len
jmp l10
l71: mov dx,len
jmp l10
l8: cmp al,77 ;стрелка
вправо
je l9
jmp l1
l9: add dx,deltaX+len
cmp dx,639
jg l91
sub dx,len
jmp l10
l91: mov dx,639-len
l10: mov newbaseX,dx
mov
newbaseY,bx
pop dx
pop bx
ret
getevent endp
start:
mov ax,data
mov ds,ax
;----------------------------------устанавливаем
графический режим 10h-------------------------------
mov ah,0
mov al,10h
int 10h
;----------------------------------------устанавливаем
режим записи 0------------------------------------
mov dx,3ceh ;адресный
регистр
mov al,5 ;регистр
режима
out dx,al
inc dx ;регистр
данных
mov al,0 ;режим
0
out dx,al
push
0a000h ;es - начало ВП
pop es
m: call drawfigure
call getevent
call clearfigure
;---------------------------------------запомним координаты вершин-------------------------------------
push
newbaseX
pop baseX
push
newbaseY
pop baseY
jmp m
exit:
;------------------------------------------возврат
в текстовый режим---------------------------------------
mov ah,0
mov al,3
int 10h
;-----------------------------------------------завершение
задачи--------------------------------------------
mov ah,4ch
int 21h
code ends
end start
8.4. Варианты заданий
Варианты заданий определяются морфологическим графом (рис.
2).
Рис. 2.
Морфологический граф вариантов заданий
Морфологический граф устанавливает 288 вариантов заданий.
Вариант разрабатываемой программы соответствует маршруту в графе, например,
1-5-9-11-14. Творческий вариант задания может быть определен выбором
собственной фигуры изображения на экране. Кроме того, к творческому варианту
возможно отнести программу, создающую при помощи клавиши простейшие графические
изображения на экране и выводящую эти изображения на принтер, работающий в
графическом режиме.
Похожие материалы:
Графитировщик асбестовых технических изделий
Графитировщик (Выпуск №20 ЕТКС)
График производственных возможностей
Графический режим
Графический режим принтера. Символы псевдографики - Авдеев В.А. и др., 2001
Графопостроители (плоттеры)
|