Консалтинговая компания Консалтер.Ру
Главная Новости Библиотека Исследования Законодательство Консалтинг Бизнес-форумы Контакты

Реклама

Рекомендуем



Консалтер.Ру > Библиотека > Информационные технологии

В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства

Учебное пособие. Таганрог: ТРТУ, 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
Графопостроители (плоттеры)



О сайте   Авторам   Реклама и услуги   Контакты
Copyright © 2007-2021, Консалтер.Ру