Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание к лабе #2 / kg_lr02 / Методичка к ЛР #2.doc
Скачиваний:
13
Добавлен:
04.04.2013
Размер:
260.61 Кб
Скачать

Приложение.

Ниже приведены примеры задач лабораторной работы по заданиям 1 и 2.

Задание 1. Переместить пятиугольник из верхнего левого в нижний правый угол. При перемещении фигуры увеличивать ее в размерах. Установить нестандартный режим с разрешением 320х200 с использованием 256 цветов. Организовать работу с двумя видеостраницами.

Для выполнения задания требуется уметь реализовывать следующие действия:

  • устанавливать требуемый графический режим,

  • очищать видеостраницу,

  • переключать видеостраницы ( устанавливать заданную в качестве активной),

  • отображать пиксел с координатами (x,y) заданного цвета на требуемой видеостранице,

  • рисовать отрезок прямой по заданным координатам точек начала и конца отрезка заданным цветом на требуемой видеостранице,

  • рисовать пятиугольник от начальной точки с координатами (x,y) заданным цветом и коэффициентом масштабирования на требуемой видеостранице.

Отображение пиксела.

Н

procedure PutPixel(x,y,c,p:word);

begin

asm

mov bx,x ; вычисление смещения по формуле

mov ax,y ; у * 80 + ( x >> 2 )

mov dx,80 ; для режима 320х200х256

mul dx

mov cx,bx

shr bx,1

shr bx,1

add bx,ax ; BX=смещение

mov ax,102h ; запись в порт 3C4h индекса 2

and cl,3 ; в порт данных 3C5h — значения

shl ah,cl ; 1 << ( x & 3 )

mov dx,3C4h

out dx,ax ; вывод 2-х байтов

mov ax,p ; вычисление сегмента видеостраницы

mov dx,400h ; AX=A000h+400h*p

mul dx

add ax,0A000h

mov es,ax

mov al,byte ptr c ; отображение пиксела цветом c

mov es:[bx],al

end;

end;

иже приведена процедура, написанная на языке Borland Pascal 7.0 с ассемблерной вставкой, которая реализует отображение пиксела с координатами (x,y) цветом с на видеостранице р.

Рисование линии.

Линия строится согласно алгоритму Брезенхема для прямых по пикселам (см. “Методические указания к лабораторной работе №1”). В этом алгоритме для отображения пиксела следует вызывать выше описанную процедуру PutPixel. Рисование линии можно оформить в виде процедуры с прототипом DrawLine( x, y, x1, y1, c, p:word).

Рисование пятиугольника.

Рисование пятиугольника от начальной точки с координатами (x,y) с коэффициентом k цветом с на странице р можно оформить в виде процедуры DrawPenta(x, y, c, p:word; k:real), пятикратно вызывающую процедуру DrawLine с необходимыми параметрами. Коэффициент k используется для расчета второй точки при вызове процедуры DrawLine.

Установка режима 320х200х256.

Н

procedure Set320x200x256;

begin

asm

mov ax,13h ; установка стандартного режима 13h

Int 10h ; средствами bios

mov dx,03C4h

mov ax,0604h ; программирование регистров

out dx,ax ; синхронизатора,

mov dx,03D4h ; контроллера ЭЛТ

mov ax,0014h

out dx,ax

mov ax,0E317h

out dx,ax

end;

end;

иже приведена процедура, реализующая установку нестандартного режима на основе режима 13h.

Замечание. Для записи содержимого младшей половины регистра AX в порт, адрес которого находится в регистре DX, и старшей половины регистра AX в порт, адрес которого вычисляется как адрес, записанный в DX + 1, можно воспользоваться одной командой out dx, ax вместо традиционного двукратного вызова out dx, ah.

Переключение видеостраниц.

Ниже приводится процедура, устанавливающая страницу page видимой.

procedure SetPage(page:word);

var

addr:word;

begin

addr:=page*$4000;

while (port[$3DA] and $8) = 0 do; ;ожидание окончания

asm ;обратного верт. хода луча

mov dx,3D4h

mov al,0Ch

out dx,al ; программирование регистров

inc dx

mov ax,addr

mov cl,8

shr ax,cl

out dx,al

dec dx

mov al,0Dh

out dx,al

inc dx

mov ax,addr

and ax,0Fh

out dx,al

end;

end;

Очистка видеостраницы.

procedure ClearPage(page:word);

begin

asm

mov dx,3C4h

mov al,2

out dx,al

inc dx

mov al,0Fh

out dx,al

mov ax,page

mov bx,400h

mul bx

add ax,0A000h

mov es,ax

xor ax,ax

xor di,di

mov cx,4000h

cld

rep stosb

end;

end;

Ниже приведена процедура, реализующая очистку видеостраницы page, устанавливая цвет для 4000h (16К) пикселов в 0.